Hex Artifact Content
Not logged in

Artifact 3701ba08d072d3468d268c307595a94ee7ff54bf:

File src/info.c part of check-in [b5f4f910b7] - Add additional hyperlinking of dates and userids. For a "circa" timeline, show the "circa" point in the timeline listing. by drh on 2009-08-29 16:45:30.

0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 30 37 20 44 2e 20 52 69 63 68  (c) 2007 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 76  lic.** License v
00b0: 65 72 73 69 6f 6e 20 32 20 61 73 20 70 75 62 6c  ersion 2 as publ
00c0: 69 73 68 65 64 20 62 79 20 74 68 65 20 46 72 65  ished by the Fre
00d0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
00e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
00f0: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73  s program is dis
0100: 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20  tributed in the 
0110: 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c  hope that it wil
0120: 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20  l be useful,.** 
0130: 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20  but WITHOUT ANY 
0140: 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75  WARRANTY; withou
0150: 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69  t even the impli
0160: 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a  ed warranty of.*
0170: 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54  * MERCHANTABILIT
0180: 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52  Y or FITNESS FOR
0190: 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 55   A PARTICULAR PU
01a0: 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 20  RPOSE.  See the 
01b0: 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20 50  GNU.** General P
01c0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f  ublic License fo
01d0: 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a  r more details..
01e0: 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c  ** .** You shoul
01f0: 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20  d have received 
0200: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e  a copy of the GN
0210: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63  U General Public
0220: 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e  .** License alon
0230: 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72  g with this libr
0240: 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69  ary; if not, wri
0250: 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65  te to the.** Fre
0260: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
0270: 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20  ation, Inc., 59 
0280: 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53  Temple Place - S
0290: 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73  uite 330,.** Bos
02a0: 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31  ton, MA  02111-1
02b0: 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20  307, USA..**.** 
02c0: 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69  Author contact i
02d0: 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20  nformation:.**  
02e0: 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a   drh@hwaci.com.*
02f0: 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68  *   http://www.h
0300: 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a  waci.com/drh/.**
0310: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  .**.** This file
0370: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 74   contains code t
0380: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
0390: 22 69 6e 66 6f 22 20 63 6f 6d 6d 61 6e 64 2e 20  "info" command. 
03a0: 20 54 68 65 0a 2a 2a 20 22 69 6e 66 6f 22 20 63   The.** "info" c
03b0: 6f 6d 6d 61 6e 64 20 67 69 76 65 73 20 63 6f 6d  ommand gives com
03c0: 6d 61 6e 64 2d 6c 69 6e 65 20 61 63 63 65 73 73  mand-line access
03d0: 20 74 6f 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   to information 
03e0: 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 75 72  about.** the cur
03f0: 72 65 6e 74 20 74 72 65 65 2c 20 6f 72 20 61 20  rent tree, or a 
0400: 70 61 72 74 69 63 75 6c 61 72 20 61 72 74 69 66  particular artif
0410: 61 63 74 20 6f 72 20 63 68 65 63 6b 2d 69 6e 2e  act or check-in.
0420: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 63 6f  .*/.#include "co
0430: 6e 66 69 67 2e 68 22 0a 23 69 6e 63 6c 75 64 65  nfig.h".#include
0440: 20 22 69 6e 66 6f 2e 68 22 0a 23 69 6e 63 6c 75   "info.h".#inclu
0450: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 0a  de <assert.h>...
0460: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 63 6f 6d 6d  /*.** Print comm
0470: 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  on information a
0480: 62 6f 75 74 20 61 20 70 61 72 74 69 63 75 6c 61  bout a particula
0490: 72 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  r record..**.** 
04a0: 20 20 20 20 2a 20 20 54 68 65 20 55 55 49 44 0a      *  The UUID.
04b0: 2a 2a 20 20 20 20 20 2a 20 20 54 68 65 20 72 65  **     *  The re
04c0: 63 6f 72 64 20 49 44 0a 2a 2a 20 20 20 20 20 2a  cord ID.**     *
04d0: 20 20 6d 74 69 6d 65 20 61 6e 64 20 63 74 69 6d    mtime and ctim
04e0: 65 0a 2a 2a 20 20 20 20 20 2a 20 20 77 68 6f 20  e.**     *  who 
04f0: 73 69 67 6e 65 64 20 69 74 0a 2a 2f 0a 76 6f 69  signed it.*/.voi
0500: 64 20 73 68 6f 77 5f 63 6f 6d 6d 6f 6e 5f 69 6e  d show_common_in
0510: 66 6f 28 69 6e 74 20 72 69 64 2c 20 63 6f 6e 73  fo(int rid, cons
0520: 74 20 63 68 61 72 20 2a 7a 55 75 69 64 4e 61 6d  t char *zUuidNam
0530: 65 2c 20 69 6e 74 20 73 68 6f 77 43 6f 6d 6d 65  e, int showComme
0540: 6e 74 29 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20  nt){.  Stmt q;. 
0550: 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 65 6e 74 20   char *zComment 
0560: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 54 61  = 0;.  char *zTa
0570: 67 73 3b 0a 20 20 63 68 61 72 20 2a 7a 44 61 74  gs;.  char *zDat
0580: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 55 75 69 64  e;.  char *zUuid
0590: 3b 0a 20 20 7a 55 75 69 64 20 3d 20 64 62 5f 74  ;.  zUuid = db_t
05a0: 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 75  ext(0, "SELECT u
05b0: 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48  uid FROM blob WH
05c0: 45 52 45 20 72 69 64 3d 25 64 22 2c 20 72 69 64  ERE rid=%d", rid
05d0: 29 3b 0a 20 20 69 66 28 20 7a 55 75 69 64 20 29  );.  if( zUuid )
05e0: 7b 0a 20 20 20 20 7a 44 61 74 65 20 3d 20 64 62  {.    zDate = db
05f0: 5f 74 65 78 74 28 22 22 2c 20 0a 20 20 20 20 20  _text("", .     
0600: 20 22 53 45 4c 45 43 54 20 64 61 74 65 74 69 6d   "SELECT datetim
0610: 65 28 6d 74 69 6d 65 29 20 7c 7c 20 27 20 55 54  e(mtime) || ' UT
0620: 43 27 20 46 52 4f 4d 20 65 76 65 6e 74 20 57 48  C' FROM event WH
0630: 45 52 45 20 6f 62 6a 69 64 3d 25 64 22 2c 0a 20  ERE objid=%d",. 
0640: 20 20 20 20 20 72 69 64 0a 20 20 20 20 29 3b 0a       rid.    );.
0650: 20 20 20 20 20 20 20 20 20 2f 2a 20 30 31 32 33           /* 0123
0660: 34 35 36 37 38 39 30 31 32 33 20 2a 2f 0a 20 20  4567890123 */.  
0670: 20 20 70 72 69 6e 74 66 28 22 25 2d 31 33 73 20    printf("%-13s 
0680: 25 73 20 25 73 5c 6e 22 2c 20 7a 55 75 69 64 4e  %s %s\n", zUuidN
0690: 61 6d 65 2c 20 7a 55 75 69 64 2c 20 7a 44 61 74  ame, zUuid, zDat
06a0: 65 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 55 75  e);.    free(zUu
06b0: 69 64 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 44  id);.    free(zD
06c0: 61 74 65 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 70  ate);.  }.  db_p
06d0: 72 65 70 61 72 65 28 26 71 2c 20 22 53 45 4c 45  repare(&q, "SELE
06e0: 43 54 20 75 75 69 64 2c 20 70 69 64 20 46 52 4f  CT uuid, pid FRO
06f0: 4d 20 70 6c 69 6e 6b 20 4a 4f 49 4e 20 62 6c 6f  M plink JOIN blo
0700: 62 20 4f 4e 20 70 69 64 3d 72 69 64 20 22 0a 20  b ON pid=rid ". 
0710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0720: 22 20 57 48 45 52 45 20 63 69 64 3d 25 64 22 2c  " WHERE cid=%d",
0730: 20 72 69 64 29 3b 0a 20 20 77 68 69 6c 65 28 20   rid);.  while( 
0740: 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c  db_step(&q)==SQL
0750: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63  ITE_ROW ){.    c
0760: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 75 69 64  onst char *zUuid
0770: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78   = db_column_tex
0780: 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 7a 44  t(&q, 0);.    zD
0790: 61 74 65 20 3d 20 64 62 5f 74 65 78 74 28 22 22  ate = db_text(""
07a0: 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  , .      "SELECT
07b0: 20 64 61 74 65 74 69 6d 65 28 6d 74 69 6d 65 29   datetime(mtime)
07c0: 20 7c 7c 20 27 20 55 54 43 27 20 46 52 4f 4d 20   || ' UTC' FROM 
07d0: 65 76 65 6e 74 20 57 48 45 52 45 20 6f 62 6a 69  event WHERE obji
07e0: 64 3d 25 64 22 2c 0a 20 20 20 20 20 20 64 62 5f  d=%d",.      db_
07f0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 31  column_int(&q, 1
0800: 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 70 72 69  ).    );.    pri
0810: 6e 74 66 28 22 70 61 72 65 6e 74 3a 20 20 20 20  ntf("parent:    
0820: 20 20 20 25 73 20 25 73 5c 6e 22 2c 20 7a 55 75     %s %s\n", zUu
0830: 69 64 2c 20 7a 44 61 74 65 29 3b 0a 20 20 20 20  id, zDate);.    
0840: 66 72 65 65 28 7a 44 61 74 65 29 3b 0a 20 20 7d  free(zDate);.  }
0850: 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26  .  db_finalize(&
0860: 71 29 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65  q);.  db_prepare
0870: 28 26 71 2c 20 22 53 45 4c 45 43 54 20 75 75 69  (&q, "SELECT uui
0880: 64 2c 20 63 69 64 20 46 52 4f 4d 20 70 6c 69 6e  d, cid FROM plin
0890: 6b 20 4a 4f 49 4e 20 62 6c 6f 62 20 4f 4e 20 63  k JOIN blob ON c
08a0: 69 64 3d 72 69 64 20 22 0a 20 20 20 20 20 20 20  id=rid ".       
08b0: 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
08c0: 45 20 70 69 64 3d 25 64 22 2c 20 72 69 64 29 3b  E pid=%d", rid);
08d0: 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65  .  while( db_ste
08e0: 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  p(&q)==SQLITE_RO
08f0: 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  W ){.    const c
0900: 68 61 72 20 2a 7a 55 75 69 64 20 3d 20 64 62 5f  har *zUuid = db_
0910: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
0920: 30 29 3b 0a 20 20 20 20 7a 44 61 74 65 20 3d 20  0);.    zDate = 
0930: 64 62 5f 74 65 78 74 28 22 22 2c 20 0a 20 20 20  db_text("", .   
0940: 20 20 20 22 53 45 4c 45 43 54 20 64 61 74 65 74     "SELECT datet
0950: 69 6d 65 28 6d 74 69 6d 65 29 20 7c 7c 20 27 20  ime(mtime) || ' 
0960: 55 54 43 27 20 46 52 4f 4d 20 65 76 65 6e 74 20  UTC' FROM event 
0970: 57 48 45 52 45 20 6f 62 6a 69 64 3d 25 64 22 2c  WHERE objid=%d",
0980: 0a 20 20 20 20 20 20 64 62 5f 63 6f 6c 75 6d 6e  .      db_column
0990: 5f 69 6e 74 28 26 71 2c 20 31 29 0a 20 20 20 20  _int(&q, 1).    
09a0: 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 63  );.    printf("c
09b0: 68 69 6c 64 3a 20 20 20 20 20 20 20 20 25 73 20  hild:        %s 
09c0: 25 73 5c 6e 22 2c 20 7a 55 75 69 64 2c 20 7a 44  %s\n", zUuid, zD
09d0: 61 74 65 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  ate);.    free(z
09e0: 44 61 74 65 29 3b 0a 20 20 7d 0a 20 20 64 62 5f  Date);.  }.  db_
09f0: 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20  finalize(&q);.  
0a00: 7a 54 61 67 73 20 3d 20 64 62 5f 74 65 78 74 28  zTags = db_text(
0a10: 30 2c 20 22 53 45 4c 45 43 54 20 67 72 6f 75 70  0, "SELECT group
0a20: 5f 63 6f 6e 63 61 74 28 73 75 62 73 74 72 28 74  _concat(substr(t
0a30: 61 67 6e 61 6d 65 2c 20 35 29 2c 20 27 2c 20 27  agname, 5), ', '
0a40: 29 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )".             
0a50: 20 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20          "  FROM 
0a60: 74 61 67 78 72 65 66 2c 20 74 61 67 22 0a 20 20  tagxref, tag".  
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a80: 20 20 20 22 20 57 48 45 52 45 20 74 61 67 78 72     " WHERE tagxr
0a90: 65 66 2e 72 69 64 3d 25 64 20 41 4e 44 20 74 61  ef.rid=%d AND ta
0aa0: 67 78 72 65 66 2e 74 61 67 74 79 70 65 3e 30 22  gxref.tagtype>0"
0ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0ac0: 20 20 20 20 20 20 22 20 20 20 41 4e 44 20 74 61        "   AND ta
0ad0: 67 2e 74 61 67 69 64 3d 74 61 67 78 72 65 66 2e  g.tagid=tagxref.
0ae0: 74 61 67 69 64 22 0a 20 20 20 20 20 20 20 20 20  tagid".         
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 20              "   
0b00: 41 4e 44 20 74 61 67 2e 74 61 67 6e 61 6d 65 20  AND tag.tagname 
0b10: 47 4c 4f 42 20 27 73 79 6d 2d 2a 27 22 2c 0a 20  GLOB 'sym-*'",. 
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b30: 20 20 20 20 72 69 64 29 3b 0a 20 20 69 66 28 20      rid);.  if( 
0b40: 7a 54 61 67 73 20 26 26 20 7a 54 61 67 73 5b 30  zTags && zTags[0
0b50: 5d 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  ] ){.    printf(
0b60: 22 74 61 67 73 3a 20 20 20 20 20 20 20 20 20 25  "tags:         %
0b70: 73 5c 6e 22 2c 20 7a 54 61 67 73 29 3b 0a 20 20  s\n", zTags);.  
0b80: 7d 0a 20 20 66 72 65 65 28 7a 54 61 67 73 29 3b  }.  free(zTags);
0b90: 0a 20 20 69 66 28 20 7a 43 6f 6d 6d 65 6e 74 20  .  if( zComment 
0ba0: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 63  ){.    printf("c
0bb0: 6f 6d 6d 65 6e 74 3a 5c 6e 25 73 5c 6e 22 2c 20  omment:\n%s\n", 
0bc0: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 66  zComment);.    f
0bd0: 72 65 65 28 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  ree(zComment);. 
0be0: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d   }.}.../*.** COM
0bf0: 4d 41 4e 44 3a 20 69 6e 66 6f 0a 2a 2a 0a 2a 2a  MAND: info.**.**
0c00: 20 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20   Usage: %fossil 
0c10: 69 6e 66 6f 20 3f 41 52 54 49 46 41 43 54 2d 49  info ?ARTIFACT-I
0c20: 44 7c 46 49 4c 45 4e 41 4d 45 3f 0a 2a 2a 0a 2a  D|FILENAME?.**.*
0c30: 2a 20 57 69 74 68 20 6e 6f 20 61 72 67 75 6d 65  * With no argume
0c40: 6e 74 73 2c 20 70 72 6f 76 69 64 65 20 69 6e 66  nts, provide inf
0c50: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
0c60: 68 65 20 63 75 72 72 65 6e 74 20 74 72 65 65 2e  he current tree.
0c70: 0a 2a 2a 20 49 66 20 61 6e 20 61 72 67 75 6d 65  .** If an argume
0c80: 6e 74 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  nt is specified,
0c90: 20 70 72 6f 76 69 64 65 20 69 6e 66 6f 72 6d 61   provide informa
0ca0: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 6f  tion about the o
0cb0: 62 6a 65 63 74 0a 2a 2a 20 69 6e 20 74 68 65 20  bject.** in the 
0cc0: 72 65 73 70 6f 73 69 74 6f 72 79 20 6f 66 20 74  respository of t
0cd0: 68 65 20 63 75 72 72 65 6e 74 20 74 72 65 65 20  he current tree 
0ce0: 74 68 61 74 20 74 68 65 20 61 72 67 75 6d 65 6e  that the argumen
0cf0: 74 20 72 65 66 65 72 73 0a 2a 2a 20 74 6f 2e 20  t refers.** to. 
0d00: 20 4f 72 20 69 66 20 74 68 65 20 61 72 67 75 6d   Or if the argum
0d10: 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
0d20: 6f 66 20 61 20 72 65 70 6f 73 69 74 6f 72 79 2c  of a repository,
0d30: 20 73 68 6f 77 0a 2a 2a 20 69 6e 66 6f 72 6d 61   show.** informa
0d40: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 61 74 20  tion about that 
0d50: 72 65 70 6f 73 69 74 6f 72 79 2e 0a 2a 2f 0a 76  repository..*/.v
0d60: 6f 69 64 20 69 6e 66 6f 5f 63 6d 64 28 76 6f 69  oid info_cmd(voi
0d70: 64 29 7b 0a 20 20 69 36 34 20 66 73 69 7a 65 3b  d){.  i64 fsize;
0d80: 0a 20 20 69 66 28 20 67 2e 61 72 67 63 21 3d 32  .  if( g.argc!=2
0d90: 20 26 26 20 67 2e 61 72 67 63 21 3d 33 20 29 7b   && g.argc!=3 ){
0da0: 0a 20 20 20 20 75 73 61 67 65 28 22 3f 46 49 4c  .    usage("?FIL
0db0: 45 4e 41 4d 45 7c 41 52 54 49 46 41 43 54 2d 49  ENAME|ARTIFACT-I
0dc0: 44 3f 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  D?");.  }.  if( 
0dd0: 67 2e 61 72 67 63 3d 3d 33 20 26 26 20 28 66 73  g.argc==3 && (fs
0de0: 69 7a 65 20 3d 20 66 69 6c 65 5f 73 69 7a 65 28  ize = file_size(
0df0: 67 2e 61 72 67 76 5b 32 5d 29 29 3e 30 20 26 26  g.argv[2]))>0 &&
0e00: 20 28 66 73 69 7a 65 26 30 78 31 66 66 29 3d 3d   (fsize&0x1ff)==
0e10: 30 20 29 7b 0a 20 20 20 20 64 62 5f 6f 70 65 6e  0 ){.    db_open
0e20: 5f 63 6f 6e 66 69 67 28 30 29 3b 0a 20 20 20 20  _config(0);.    
0e30: 64 62 5f 72 65 63 6f 72 64 5f 72 65 70 6f 73 69  db_record_reposi
0e40: 74 6f 72 79 5f 66 69 6c 65 6e 61 6d 65 28 67 2e  tory_filename(g.
0e50: 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 64 62  argv[2]);.    db
0e60: 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79  _open_repository
0e70: 28 67 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20  (g.argv[2]);.   
0e80: 20 70 72 69 6e 74 66 28 22 70 72 6f 6a 65 63 74   printf("project
0e90: 2d 63 6f 64 65 3a 20 25 73 5c 6e 22 2c 20 64 62  -code: %s\n", db
0ea0: 5f 67 65 74 28 22 70 72 6f 6a 65 63 74 2d 63 6f  _get("project-co
0eb0: 64 65 22 2c 20 22 3c 6e 6f 6e 65 3e 22 29 29 3b  de", "<none>"));
0ec0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 70 72 6f  .    printf("pro
0ed0: 6a 65 63 74 2d 6e 61 6d 65 3a 20 25 73 5c 6e 22  ject-name: %s\n"
0ee0: 2c 20 64 62 5f 67 65 74 28 22 70 72 6f 6a 65 63  , db_get("projec
0ef0: 74 2d 6e 61 6d 65 22 2c 20 22 3c 75 6e 6e 61 6d  t-name", "<unnam
0f00: 65 64 3e 22 29 29 3b 0a 20 20 20 20 70 72 69 6e  ed>"));.    prin
0f10: 74 66 28 22 73 65 72 76 65 72 2d 63 6f 64 65 3a  tf("server-code:
0f20: 20 20 25 73 5c 6e 22 2c 20 64 62 5f 67 65 74 28    %s\n", db_get(
0f30: 22 73 65 72 76 65 72 2d 63 6f 64 65 22 2c 20 22  "server-code", "
0f40: 3c 6e 6f 6e 65 3e 22 29 29 3b 0a 20 20 20 20 72  <none>"));.    r
0f50: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 64 62 5f  eturn;.  }.  db_
0f60: 6d 75 73 74 5f 62 65 5f 77 69 74 68 69 6e 5f 74  must_be_within_t
0f70: 72 65 65 28 29 3b 0a 20 20 69 66 28 20 67 2e 61  ree();.  if( g.a
0f80: 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e  rgc==2 ){.    in
0f90: 74 20 76 69 64 3b 0a 20 20 20 20 20 20 20 20 20  t vid;.         
0fa0: 2f 2a 20 30 31 32 33 34 35 36 37 38 39 30 31 32  /* 0123456789012
0fb0: 33 34 20 2a 2f 0a 20 20 20 20 64 62 5f 72 65 63  34 */.    db_rec
0fc0: 6f 72 64 5f 72 65 70 6f 73 69 74 6f 72 79 5f 66  ord_repository_f
0fd0: 69 6c 65 6e 61 6d 65 28 30 29 3b 0a 20 20 20 20  ilename(0);.    
0fe0: 70 72 69 6e 74 66 28 22 72 65 70 6f 73 69 74 6f  printf("reposito
0ff0: 72 79 3a 20 20 20 25 73 5c 6e 22 2c 20 64 62 5f  ry:   %s\n", db_
1000: 6c 67 65 74 28 22 72 65 70 6f 73 69 74 6f 72 79  lget("repository
1010: 22 2c 20 22 22 29 29 3b 0a 20 20 20 20 70 72 69  ", ""));.    pri
1020: 6e 74 66 28 22 6c 6f 63 61 6c 2d 72 6f 6f 74 3a  ntf("local-root:
1030: 20 20 20 25 73 5c 6e 22 2c 20 67 2e 7a 4c 6f 63     %s\n", g.zLoc
1040: 61 6c 52 6f 6f 74 29 3b 0a 20 20 20 20 70 72 69  alRoot);.    pri
1050: 6e 74 66 28 22 70 72 6f 6a 65 63 74 2d 63 6f 64  ntf("project-cod
1060: 65 3a 20 25 73 5c 6e 22 2c 20 64 62 5f 67 65 74  e: %s\n", db_get
1070: 28 22 70 72 6f 6a 65 63 74 2d 63 6f 64 65 22 2c  ("project-code",
1080: 20 22 22 29 29 3b 0a 20 20 20 20 70 72 69 6e 74   ""));.    print
1090: 66 28 22 73 65 72 76 65 72 2d 63 6f 64 65 3a 20  f("server-code: 
10a0: 20 25 73 5c 6e 22 2c 20 64 62 5f 67 65 74 28 22   %s\n", db_get("
10b0: 73 65 72 76 65 72 2d 63 6f 64 65 22 2c 20 22 22  server-code", ""
10c0: 29 29 3b 0a 20 20 20 20 76 69 64 20 3d 20 64 62  ));.    vid = db
10d0: 5f 6c 67 65 74 5f 69 6e 74 28 22 63 68 65 63 6b  _lget_int("check
10e0: 6f 75 74 22 2c 20 30 29 3b 0a 20 20 20 20 69 66  out", 0);.    if
10f0: 28 20 76 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ( vid==0 ){.    
1100: 20 20 70 72 69 6e 74 66 28 22 63 68 65 63 6b 6f    printf("checko
1110: 75 74 3a 20 20 20 20 20 6e 69 6c 5c 6e 22 29 3b  ut:     nil\n");
1120: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1130: 20 20 73 68 6f 77 5f 63 6f 6d 6d 6f 6e 5f 69 6e    show_common_in
1140: 66 6f 28 76 69 64 2c 20 22 63 68 65 63 6b 6f 75  fo(vid, "checkou
1150: 74 3a 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  t:", 1);.    }. 
1160: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1170: 72 69 64 3b 0a 20 20 20 20 72 69 64 20 3d 20 6e  rid;.    rid = n
1180: 61 6d 65 5f 74 6f 5f 72 69 64 28 67 2e 61 72 67  ame_to_rid(g.arg
1190: 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  v[2]);.    if( r
11a0: 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  id==0 ){.      f
11b0: 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22 6e 6f 20  ossil_panic("no 
11c0: 73 75 63 68 20 6f 62 6a 65 63 74 3a 20 25 73 5c  such object: %s\
11d0: 6e 22 2c 20 67 2e 61 72 67 76 5b 32 5d 29 3b 0a  n", g.argv[2]);.
11e0: 20 20 20 20 7d 0a 20 20 20 20 73 68 6f 77 5f 63      }.    show_c
11f0: 6f 6d 6d 6f 6e 5f 69 6e 66 6f 28 72 69 64 2c 20  ommon_info(rid, 
1200: 22 75 75 69 64 3a 22 2c 20 31 29 3b 0a 20 20 7d  "uuid:", 1);.  }
1210: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 6f 77 20 69  .}../*.** Show i
1220: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
1230: 20 61 6c 6c 20 74 61 67 73 20 6f 6e 20 61 20 67   all tags on a g
1240: 69 76 65 6e 20 6e 6f 64 65 2e 0a 2a 2f 0a 73 74  iven node..*/.st
1250: 61 74 69 63 20 76 6f 69 64 20 73 68 6f 77 54 61  atic void showTa
1260: 67 73 28 69 6e 74 20 72 69 64 2c 20 63 6f 6e 73  gs(int rid, cons
1270: 74 20 63 68 61 72 20 2a 7a 4e 6f 74 47 6c 6f 62  t char *zNotGlob
1280: 29 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 69  ){.  Stmt q;.  i
1290: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 64 62  nt cnt = 0;.  db
12a0: 5f 70 72 65 70 61 72 65 28 26 71 2c 0a 20 20 20  _prepare(&q,.   
12b0: 20 22 53 45 4c 45 43 54 20 74 61 67 2e 74 61 67   "SELECT tag.tag
12c0: 69 64 2c 20 74 61 67 6e 61 6d 65 2c 20 22 0a 20  id, tagname, ". 
12d0: 20 20 20 22 20 20 20 20 20 20 20 28 53 45 4c 45     "       (SELE
12e0: 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f  CT uuid FROM blo
12f0: 62 20 57 48 45 52 45 20 72 69 64 3d 74 61 67 78  b WHERE rid=tagx
1300: 72 65 66 2e 73 72 63 69 64 20 41 4e 44 20 72 69  ref.srcid AND ri
1310: 64 21 3d 25 64 29 2c 22 0a 20 20 20 20 22 20 20  d!=%d),".    "  
1320: 20 20 20 20 20 76 61 6c 75 65 2c 20 64 61 74 65       value, date
1330: 74 69 6d 65 28 74 61 67 78 72 65 66 2e 6d 74 69  time(tagxref.mti
1340: 6d 65 2c 27 6c 6f 63 61 6c 74 69 6d 65 27 29 2c  me,'localtime'),
1350: 20 74 61 67 74 79 70 65 2c 22 0a 20 20 20 20 22   tagtype,".    "
1360: 20 20 20 20 20 20 20 28 53 45 4c 45 43 54 20 75         (SELECT u
1370: 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48  uid FROM blob WH
1380: 45 52 45 20 72 69 64 3d 74 61 67 78 72 65 66 2e  ERE rid=tagxref.
1390: 6f 72 69 67 69 64 20 41 4e 44 20 72 69 64 21 3d  origid AND rid!=
13a0: 25 64 29 22 0a 20 20 20 20 22 20 20 46 52 4f 4d  %d)".    "  FROM
13b0: 20 74 61 67 78 72 65 66 20 4a 4f 49 4e 20 74 61   tagxref JOIN ta
13c0: 67 20 4f 4e 20 74 61 67 78 72 65 66 2e 74 61 67  g ON tagxref.tag
13d0: 69 64 3d 74 61 67 2e 74 61 67 69 64 22 0a 20 20  id=tag.tagid".  
13e0: 20 20 22 20 57 48 45 52 45 20 74 61 67 78 72 65    " WHERE tagxre
13f0: 66 2e 72 69 64 3d 25 64 20 41 4e 44 20 74 61 67  f.rid=%d AND tag
1400: 6e 61 6d 65 20 4e 4f 54 20 47 4c 4f 42 20 27 25  name NOT GLOB '%
1410: 73 27 22 0a 20 20 20 20 22 20 4f 52 44 45 52 20  s'".    " ORDER 
1420: 42 59 20 74 61 67 6e 61 6d 65 22 2c 20 72 69 64  BY tagname", rid
1430: 2c 20 72 69 64 2c 20 72 69 64 2c 20 7a 4e 6f 74  , rid, rid, zNot
1440: 47 6c 6f 62 0a 20 20 29 3b 0a 20 20 77 68 69 6c  Glob.  );.  whil
1450: 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d  e( db_step(&q)==
1460: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
1470: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1480: 61 67 6e 61 6d 65 20 3d 20 64 62 5f 63 6f 6c 75  agname = db_colu
1490: 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31 29 3b 0a  mn_text(&q, 1);.
14a0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
14b0: 7a 53 72 63 55 75 69 64 20 3d 20 64 62 5f 63 6f  zSrcUuid = db_co
14c0: 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 32 29  lumn_text(&q, 2)
14d0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
14e0: 20 2a 7a 56 61 6c 75 65 20 3d 20 64 62 5f 63 6f   *zValue = db_co
14f0: 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 33 29  lumn_text(&q, 3)
1500: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
1510: 20 2a 7a 44 61 74 65 20 3d 20 64 62 5f 63 6f 6c   *zDate = db_col
1520: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 34 29 3b  umn_text(&q, 4);
1530: 0a 20 20 20 20 69 6e 74 20 74 61 67 74 79 70 65  .    int tagtype
1540: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   = db_column_int
1550: 28 26 71 2c 20 35 29 3b 0a 20 20 20 20 63 6f 6e  (&q, 5);.    con
1560: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 55 75  st char *zOrigUu
1570: 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  id = db_column_t
1580: 65 78 74 28 26 71 2c 20 36 29 3b 0a 20 20 20 20  ext(&q, 6);.    
1590: 63 6e 74 2b 2b 3b 0a 20 20 20 20 69 66 28 20 63  cnt++;.    if( c
15a0: 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 40  nt==1 ){.      @
15b0: 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 73 65 63   <div class="sec
15c0: 74 69 6f 6e 22 3e 54 61 67 73 20 41 6e 64 20 50  tion">Tags And P
15d0: 72 6f 70 65 72 74 69 65 73 3c 2f 64 69 76 3e 0a  roperties</div>.
15e0: 20 20 20 20 20 20 40 20 3c 75 6c 3e 0a 20 20 20        @ <ul>.   
15f0: 20 7d 0a 20 20 20 20 40 20 3c 6c 69 3e 0a 20 20   }.    @ <li>.  
1600: 20 20 69 66 28 20 74 61 67 74 79 70 65 3d 3d 30    if( tagtype==0
1610: 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 62 3e 3c   ){.      @ <b><
1620: 73 3e 25 68 28 7a 54 61 67 6e 61 6d 65 29 3c 2f  s>%h(zTagname)</
1630: 73 3e 3c 2f 62 3e 20 63 61 6e 63 65 6c 6c 65 64  s></b> cancelled
1640: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
1650: 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 40  Value ){.      @
1660: 20 3c 62 3e 25 68 28 7a 54 61 67 6e 61 6d 65 29   <b>%h(zTagname)
1670: 3d 25 68 28 7a 56 61 6c 75 65 29 3c 2f 62 3e 0a  =%h(zValue)</b>.
1680: 20 20 20 20 7d 65 6c 73 65 20 7b 0a 20 20 20 20      }else {.    
1690: 20 20 40 20 3c 62 3e 25 68 28 7a 54 61 67 6e 61    @ <b>%h(zTagna
16a0: 6d 65 29 3c 2f 62 3e 0a 20 20 20 20 7d 0a 20 20  me)</b>.    }.  
16b0: 20 20 69 66 28 20 74 61 67 74 79 70 65 3d 3d 32    if( tagtype==2
16c0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 4f   ){.      if( zO
16d0: 72 69 67 55 75 69 64 20 26 26 20 7a 4f 72 69 67  rigUuid && zOrig
16e0: 55 75 69 64 5b 30 5d 20 29 7b 0a 20 20 20 20 20  Uuid[0] ){.     
16f0: 20 20 20 40 20 69 6e 68 65 72 69 74 65 64 20 66     @ inherited f
1700: 72 6f 6d 0a 20 20 20 20 20 20 20 20 68 79 70 65  rom.        hype
1710: 72 6c 69 6e 6b 5f 74 6f 5f 75 75 69 64 28 7a 4f  rlink_to_uuid(zO
1720: 72 69 67 55 75 69 64 29 3b 0a 20 20 20 20 20 20  rigUuid);.      
1730: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 40  }else{.        @
1740: 20 70 72 6f 70 61 67 61 74 65 73 20 74 6f 20 64   propagates to d
1750: 65 73 63 65 6e 64 61 6e 74 73 0a 20 20 20 20 20  escendants.     
1760: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1770: 20 7a 53 72 63 55 75 69 64 20 26 26 20 7a 53 72   zSrcUuid && zSr
1780: 63 55 75 69 64 5b 30 5d 20 29 7b 0a 20 20 20 20  cUuid[0] ){.    
1790: 20 20 69 66 28 20 74 61 67 74 79 70 65 3d 3d 30    if( tagtype==0
17a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 40 20 62 79   ){.        @ by
17b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17c0: 20 20 20 20 20 20 40 20 61 64 64 65 64 20 62 79        @ added by
17d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 68  .      }.      h
17e0: 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 75 69 64  yperlink_to_uuid
17f0: 28 7a 53 72 63 55 75 69 64 29 3b 0a 20 20 20 20  (zSrcUuid);.    
1800: 20 20 40 20 6f 6e 0a 20 20 20 20 20 20 68 79 70    @ on.      hyp
1810: 65 72 6c 69 6e 6b 5f 74 6f 5f 64 61 74 65 28 7a  erlink_to_date(z
1820: 44 61 74 65 2c 30 29 3b 0a 20 20 20 20 7d 0a 20  Date,0);.    }. 
1830: 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65   }.  db_finalize
1840: 28 26 71 29 3b 0a 20 20 69 66 28 20 63 6e 74 20  (&q);.  if( cnt 
1850: 29 7b 0a 20 20 20 20 40 20 3c 2f 75 6c 3e 0a 20  ){.    @ </ul>. 
1860: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70   }.}.../*.** App
1870: 65 6e 64 20 74 68 65 20 64 69 66 66 65 72 65 6e  end the differen
1880: 63 65 20 62 65 74 77 65 65 6e 20 74 77 6f 20 52  ce between two R
1890: 49 44 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75  IDs to the outpu
18a0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
18b0: 20 61 70 70 65 6e 64 5f 64 69 66 66 28 69 6e 74   append_diff(int
18c0: 20 66 72 6f 6d 69 64 2c 20 69 6e 74 20 74 6f 69   fromid, int toi
18d0: 64 29 7b 0a 20 20 42 6c 6f 62 20 66 72 6f 6d 2c  d){.  Blob from,
18e0: 20 74 6f 2c 20 6f 75 74 3b 0a 20 20 63 6f 6e 74   to, out;.  cont
18f0: 65 6e 74 5f 67 65 74 28 66 72 6f 6d 69 64 2c 20  ent_get(fromid, 
1900: 26 66 72 6f 6d 29 3b 0a 20 20 63 6f 6e 74 65 6e  &from);.  conten
1910: 74 5f 67 65 74 28 74 6f 69 64 2c 20 26 74 6f 29  t_get(toid, &to)
1920: 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 6f  ;.  blob_zero(&o
1930: 75 74 29 3b 0a 20 20 74 65 78 74 5f 64 69 66 66  ut);.  text_diff
1940: 28 26 66 72 6f 6d 2c 20 26 74 6f 2c 20 26 6f 75  (&from, &to, &ou
1950: 74 2c 20 35 29 3b 0a 20 20 40 20 25 68 28 62 6c  t, 5);.  @ %h(bl
1960: 6f 62 5f 73 74 72 28 26 6f 75 74 29 29 0a 20 20  ob_str(&out)).  
1970: 62 6c 6f 62 5f 72 65 73 65 74 28 26 66 72 6f 6d  blob_reset(&from
1980: 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28  );.  blob_reset(
1990: 26 74 6f 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73  &to);.  blob_res
19a0: 65 74 28 26 6f 75 74 29 3b 20 20 0a 7d 0a 0a 0a  et(&out);  .}...
19b0: 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 76  /*.** WEBPAGE: v
19c0: 69 6e 66 6f 0a 2a 2a 20 57 45 42 50 41 47 45 3a  info.** WEBPAGE:
19d0: 20 63 69 0a 2a 2a 20 55 52 4c 3a 20 20 2f 63 69   ci.** URL:  /ci
19e0: 3f 6e 61 6d 65 3d 52 49 44 7c 41 52 54 49 46 41  ?name=RID|ARTIFA
19f0: 43 54 49 44 0a 2a 2a 0a 2a 2a 20 44 69 73 70 6c  CTID.**.** Displ
1a00: 61 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ay information a
1a10: 62 6f 75 74 20 61 20 70 61 72 74 69 63 75 6c 61  bout a particula
1a20: 72 20 63 68 65 63 6b 2d 69 6e 2e 0a 2a 2f 0a 76  r check-in..*/.v
1a30: 6f 69 64 20 63 69 5f 70 61 67 65 28 76 6f 69 64  oid ci_page(void
1a40: 29 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 69  ){.  Stmt q;.  i
1a50: 6e 74 20 72 69 64 3b 0a 20 20 69 6e 74 20 69 73  nt rid;.  int is
1a60: 4c 65 61 66 3b 0a 0a 20 20 6c 6f 67 69 6e 5f 63  Leaf;..  login_c
1a70: 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73  heck_credentials
1a80: 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b 52  ();.  if( !g.okR
1a90: 65 61 64 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65  ead ){ login_nee
1aa0: 64 65 64 28 29 3b 20 72 65 74 75 72 6e 3b 20 7d  ded(); return; }
1ab0: 0a 20 20 72 69 64 20 3d 20 6e 61 6d 65 5f 74 6f  .  rid = name_to
1ac0: 5f 72 69 64 28 50 44 28 22 6e 61 6d 65 22 2c 22  _rid(PD("name","
1ad0: 30 22 29 29 3b 0a 20 20 69 66 28 20 72 69 64 3d  0"));.  if( rid=
1ae0: 3d 30 20 29 7b 0a 20 20 20 20 73 74 79 6c 65 5f  =0 ){.    style_
1af0: 68 65 61 64 65 72 28 22 43 68 65 63 6b 2d 69 6e  header("Check-in
1b00: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 45 72 72   Information Err
1b10: 6f 72 22 29 3b 0a 20 20 20 20 40 20 4e 6f 20 73  or");.    @ No s
1b20: 75 63 68 20 6f 62 6a 65 63 74 3a 20 25 68 28 67  uch object: %h(g
1b30: 2e 61 72 67 76 5b 32 5d 29 0a 20 20 20 20 73 74  .argv[2]).    st
1b40: 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 20 20  yle_footer();.  
1b50: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1b60: 69 73 4c 65 61 66 20 3d 20 21 64 62 5f 65 78 69  isLeaf = !db_exi
1b70: 73 74 73 28 22 53 45 4c 45 43 54 20 31 20 46 52  sts("SELECT 1 FR
1b80: 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45 20 70  OM plink WHERE p
1b90: 69 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20  id=%d", rid);.  
1ba0: 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 0a  db_prepare(&q, .
1bb0: 20 20 20 20 20 22 53 45 4c 45 43 54 20 75 75 69       "SELECT uui
1bc0: 64 2c 20 64 61 74 65 74 69 6d 65 28 6d 74 69 6d  d, datetime(mtim
1bd0: 65 2c 20 27 6c 6f 63 61 6c 74 69 6d 65 27 29 2c  e, 'localtime'),
1be0: 20 75 73 65 72 2c 20 63 6f 6d 6d 65 6e 74 22 0a   user, comment".
1bf0: 20 20 20 20 20 22 20 20 46 52 4f 4d 20 62 6c 6f       "  FROM blo
1c00: 62 2c 20 65 76 65 6e 74 22 0a 20 20 20 20 20 22  b, event".     "
1c10: 20 57 48 45 52 45 20 62 6c 6f 62 2e 72 69 64 3d   WHERE blob.rid=
1c20: 25 64 22 0a 20 20 20 20 20 22 20 20 20 41 4e 44  %d".     "   AND
1c30: 20 65 76 65 6e 74 2e 6f 62 6a 69 64 3d 25 64 22   event.objid=%d"
1c40: 2c 0a 20 20 20 20 20 72 69 64 2c 20 72 69 64 0a  ,.     rid, rid.
1c50: 20 20 29 3b 0a 20 20 69 66 28 20 64 62 5f 73 74    );.  if( db_st
1c60: 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52  ep(&q)==SQLITE_R
1c70: 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OW ){.    const 
1c80: 63 68 61 72 20 2a 7a 55 75 69 64 20 3d 20 64 62  char *zUuid = db
1c90: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c  _column_text(&q,
1ca0: 20 30 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   0);.    char *z
1cb0: 54 69 74 6c 65 20 3d 20 6d 70 72 69 6e 74 66 28  Title = mprintf(
1cc0: 22 43 68 65 63 6b 2d 69 6e 20 5b 25 2e 31 30 73  "Check-in [%.10s
1cd0: 5d 22 2c 20 7a 55 75 69 64 29 3b 0a 20 20 20 20  ]", zUuid);.    
1ce0: 63 68 61 72 20 2a 7a 45 55 73 65 72 2c 20 2a 7a  char *zEUser, *z
1cf0: 45 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 63 6f  EComment;.    co
1d00: 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 65 72 3b  nst char *zUser;
1d10: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1d20: 2a 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 63  *zComment;.    c
1d30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 65  onst char *zDate
1d40: 3b 0a 20 20 20 20 73 74 79 6c 65 5f 68 65 61 64  ;.    style_head
1d50: 65 72 28 7a 54 69 74 6c 65 29 3b 0a 20 20 20 20  er(zTitle);.    
1d60: 6c 6f 67 69 6e 5f 61 6e 6f 6e 79 6d 6f 75 73 5f  login_anonymous_
1d70: 61 76 61 69 6c 61 62 6c 65 28 29 3b 0a 20 20 20  available();.   
1d80: 20 66 72 65 65 28 7a 54 69 74 6c 65 29 3b 0a 20   free(zTitle);. 
1d90: 20 20 20 7a 45 55 73 65 72 20 3d 20 64 62 5f 74     zEUser = db_t
1da0: 65 78 74 28 30 2c 0a 20 20 20 20 20 20 20 20 20  ext(0,.         
1db0: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
1dc0: 54 20 76 61 6c 75 65 20 46 52 4f 4d 20 74 61 67  T value FROM tag
1dd0: 78 72 65 66 20 57 48 45 52 45 20 74 61 67 69 64  xref WHERE tagid
1de0: 3d 25 64 20 41 4e 44 20 72 69 64 3d 25 64 22 2c  =%d AND rid=%d",
1df0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e00: 20 20 20 20 20 54 41 47 5f 55 53 45 52 2c 20 72       TAG_USER, r
1e10: 69 64 29 3b 0a 20 20 20 20 7a 45 43 6f 6d 6d 65  id);.    zEComme
1e20: 6e 74 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20  nt = db_text(0, 
1e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e40: 20 20 20 20 22 53 45 4c 45 43 54 20 76 61 6c 75      "SELECT valu
1e50: 65 20 46 52 4f 4d 20 74 61 67 78 72 65 66 20 57  e FROM tagxref W
1e60: 48 45 52 45 20 74 61 67 69 64 3d 25 64 20 41 4e  HERE tagid=%d AN
1e70: 44 20 72 69 64 3d 25 64 22 2c 0a 20 20 20 20 20  D rid=%d",.     
1e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 41                TA
1e90: 47 5f 43 4f 4d 4d 45 4e 54 2c 20 72 69 64 29 3b  G_COMMENT, rid);
1ea0: 0a 20 20 20 20 7a 55 73 65 72 20 3d 20 64 62 5f  .    zUser = db_
1eb0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
1ec0: 32 29 3b 0a 20 20 20 20 7a 43 6f 6d 6d 65 6e 74  2);.    zComment
1ed0: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78   = db_column_tex
1ee0: 74 28 26 71 2c 20 33 29 3b 0a 20 20 20 20 7a 44  t(&q, 3);.    zD
1ef0: 61 74 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  ate = db_column_
1f00: 74 65 78 74 28 26 71 2c 31 29 3b 0a 20 20 20 20  text(&q,1);.    
1f10: 40 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 73 65  @ <div class="se
1f20: 63 74 69 6f 6e 22 3e 4f 76 65 72 76 69 65 77 3c  ction">Overview<
1f30: 2f 64 69 76 3e 0a 20 20 20 20 40 20 3c 70 3e 3c  /div>.    @ <p><
1f40: 74 61 62 6c 65 20 63 6c 61 73 73 3d 22 6c 61 62  table class="lab
1f50: 65 6c 2d 76 61 6c 75 65 22 3e 0a 20 20 20 20 40  el-value">.    @
1f60: 20 3c 74 72 3e 3c 74 68 3e 53 48 41 31 26 6e 62   <tr><th>SHA1&nb
1f70: 73 70 3b 48 61 73 68 3a 3c 2f 74 68 3e 3c 74 64  sp;Hash:</th><td
1f80: 3e 25 73 28 7a 55 75 69 64 29 0a 20 20 20 20 69  >%s(zUuid).    i
1f90: 66 28 20 67 2e 6f 6b 53 65 74 75 70 20 29 7b 0a  f( g.okSetup ){.
1fa0: 20 20 20 20 20 20 40 20 28 52 65 63 6f 72 64 20        @ (Record 
1fb0: 49 44 3a 20 25 64 28 72 69 64 29 29 0a 20 20 20  ID: %d(rid)).   
1fc0: 20 7d 0a 20 20 20 20 40 20 3c 2f 74 64 3e 3c 2f   }.    @ </td></
1fd0: 74 72 3e 0a 20 20 20 20 40 20 3c 74 72 3e 3c 74  tr>.    @ <tr><t
1fe0: 68 3e 44 61 74 65 3a 3c 2f 74 68 3e 3c 74 64 3e  h>Date:</th><td>
1ff0: 0a 20 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f 74  .    hyperlink_t
2000: 6f 5f 64 61 74 65 28 7a 44 61 74 65 2c 20 22 3c  o_date(zDate, "<
2010: 2f 74 64 3e 3c 2f 74 72 3e 22 29 3b 0a 20 20 20  /td></tr>");.   
2020: 20 69 66 28 20 7a 45 55 73 65 72 20 29 7b 0a 20   if( zEUser ){. 
2030: 20 20 20 20 20 40 20 3c 74 72 3e 3c 74 68 3e 45       @ <tr><th>E
2040: 64 69 74 65 64 26 6e 62 73 70 3b 55 73 65 72 3a  dited&nbsp;User:
2050: 3c 2f 74 64 3e 3c 74 64 3e 0a 20 20 20 20 20 20  </td><td>.      
2060: 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 73 65  hyperlink_to_use
2070: 72 28 7a 45 55 73 65 72 2c 7a 44 61 74 65 2c 22  r(zEUser,zDate,"
2080: 3c 2f 74 64 3e 3c 2f 74 72 3e 22 29 3b 0a 20 20  </td></tr>");.  
2090: 20 20 20 20 40 20 3c 74 72 3e 3c 74 68 3e 4f 72      @ <tr><th>Or
20a0: 69 67 69 6e 61 6c 26 6e 62 73 70 3b 55 73 65 72  iginal&nbsp;User
20b0: 3a 3c 2f 74 68 3e 3c 74 64 3e 0a 20 20 20 20 20  :</th><td>.     
20c0: 20 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 73   hyperlink_to_us
20d0: 65 72 28 7a 55 73 65 72 2c 7a 44 61 74 65 2c 22  er(zUser,zDate,"
20e0: 3c 2f 74 64 3e 3c 2f 74 72 3e 22 29 3b 0a 20 20  </td></tr>");.  
20f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 40    }else{.      @
2100: 20 3c 74 72 3e 3c 74 68 3e 55 73 65 72 3a 3c 2f   <tr><th>User:</
2110: 74 64 3e 3c 74 64 3e 0a 20 20 20 20 20 20 68 79  td><td>.      hy
2120: 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 73 65 72 28  perlink_to_user(
2130: 7a 55 73 65 72 2c 7a 44 61 74 65 2c 22 3c 2f 74  zUser,zDate,"</t
2140: 64 3e 3c 2f 74 72 3e 22 29 3b 0a 20 20 20 20 7d  d></tr>");.    }
2150: 0a 20 20 20 20 69 66 28 20 7a 45 43 6f 6d 6d 65  .    if( zEComme
2160: 6e 74 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 74  nt ){.      @ <t
2170: 72 3e 3c 74 68 3e 45 64 69 74 65 64 26 6e 62 73  r><th>Edited&nbs
2180: 70 3b 43 6f 6d 6d 65 6e 74 3a 3c 2f 74 68 3e 3c  p;Comment:</th><
2190: 74 64 3e 25 77 28 7a 45 43 6f 6d 6d 65 6e 74 29  td>%w(zEComment)
21a0: 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 20 20 20  </td></tr>.     
21b0: 20 40 20 3c 74 72 3e 3c 74 68 3e 4f 72 69 67 69   @ <tr><th>Origi
21c0: 6e 61 6c 26 6e 62 73 70 3b 43 6f 6d 6d 65 6e 74  nal&nbsp;Comment
21d0: 3a 3c 2f 74 68 3e 3c 74 64 3e 25 77 28 7a 43 6f  :</th><td>%w(zCo
21e0: 6d 6d 65 6e 74 29 3c 2f 74 64 3e 3c 2f 74 72 3e  mment)</td></tr>
21f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2200: 20 20 40 20 3c 74 72 3e 3c 74 68 3e 43 6f 6d 6d    @ <tr><th>Comm
2210: 65 6e 74 3a 3c 2f 74 68 3e 3c 74 64 3e 25 77 28  ent:</th><td>%w(
2220: 7a 43 6f 6d 6d 65 6e 74 29 3c 2f 74 64 3e 3c 2f  zComment)</td></
2230: 74 72 3e 0a 20 20 20 20 7d 0a 20 20 20 20 40 20  tr>.    }.    @ 
2240: 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 20 20 69  </td></tr>.    i
2250: 66 28 20 67 2e 6f 6b 41 64 6d 69 6e 20 29 7b 0a  f( g.okAdmin ){.
2260: 20 20 20 20 20 20 64 62 5f 70 72 65 70 61 72 65        db_prepare
2270: 28 26 71 2c 20 0a 20 20 20 20 20 20 20 20 20 22  (&q, .         "
2280: 53 45 4c 45 43 54 20 72 63 76 66 72 6f 6d 2e 69  SELECT rcvfrom.i
2290: 70 61 64 64 72 2c 20 75 73 65 72 2e 6c 6f 67 69  paddr, user.logi
22a0: 6e 2c 20 64 61 74 65 74 69 6d 65 28 72 63 76 66  n, datetime(rcvf
22b0: 72 6f 6d 2e 6d 74 69 6d 65 29 22 0a 20 20 20 20  rom.mtime)".    
22c0: 20 20 20 20 20 22 20 20 46 52 4f 4d 20 62 6c 6f       "  FROM blo
22d0: 62 20 4a 4f 49 4e 20 72 63 76 66 72 6f 6d 20 55  b JOIN rcvfrom U
22e0: 53 49 4e 47 28 72 63 76 69 64 29 20 4c 45 46 54  SING(rcvid) LEFT
22f0: 20 4a 4f 49 4e 20 75 73 65 72 20 55 53 49 4e 47   JOIN user USING
2300: 28 75 69 64 29 22 0a 20 20 20 20 20 20 20 20 20  (uid)".         
2310: 22 20 57 48 45 52 45 20 62 6c 6f 62 2e 72 69 64  " WHERE blob.rid
2320: 3d 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 72  =%d",.         r
2330: 69 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  id.      );.    
2340: 20 20 69 66 28 20 64 62 5f 73 74 65 70 28 26 71    if( db_step(&q
2350: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
2360: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
2370: 68 61 72 20 2a 7a 49 70 41 64 64 72 20 3d 20 64  har *zIpAddr = d
2380: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
2390: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  , 0);.        co
23a0: 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 65 72 20  nst char *zUser 
23b0: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
23c0: 28 26 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  (&q, 1);.       
23d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
23e0: 74 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  te = db_column_t
23f0: 65 78 74 28 26 71 2c 20 32 29 3b 0a 20 20 20 20  ext(&q, 2);.    
2400: 20 20 20 20 69 66 28 20 7a 55 73 65 72 3d 3d 30      if( zUser==0
2410: 20 7c 7c 20 7a 55 73 65 72 5b 30 5d 3d 3d 30 20   || zUser[0]==0 
2420: 29 20 7a 55 73 65 72 20 3d 20 22 75 6e 6b 6e 6f  ) zUser = "unkno
2430: 77 6e 22 3b 0a 20 20 20 20 20 20 20 20 40 20 3c  wn";.        @ <
2440: 74 72 3e 3c 74 68 3e 52 65 63 65 69 76 65 64 26  tr><th>Received&
2450: 6e 62 73 70 3b 46 72 6f 6d 3a 3c 2f 74 68 3e 0a  nbsp;From:</th>.
2460: 20 20 20 20 20 20 20 20 40 20 3c 74 64 3e 25 68          @ <td>%h
2470: 28 7a 55 73 65 72 29 20 40 20 25 68 28 7a 49 70  (zUser) @ %h(zIp
2480: 41 64 64 72 29 20 6f 6e 20 25 73 28 7a 44 61 74  Addr) on %s(zDat
2490: 65 29 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 20  e)</td></tr>.   
24a0: 20 20 20 7d 0a 20 20 20 20 20 20 64 62 5f 66 69     }.      db_fi
24b0: 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 20 20  nalize(&q);.    
24c0: 7d 0a 20 20 20 20 69 66 28 20 67 2e 6f 6b 48 69  }.    if( g.okHi
24d0: 73 74 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 63  story ){.      c
24e0: 68 61 72 20 2a 7a 53 68 6f 72 74 55 75 69 64 20  har *zShortUuid 
24f0: 3d 20 6d 70 72 69 6e 74 66 28 22 25 2e 31 30 73  = mprintf("%.10s
2500: 22 2c 20 7a 55 75 69 64 29 3b 0a 20 20 20 20 20  ", zUuid);.     
2510: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72   const char *zPr
2520: 6f 6a 4e 61 6d 65 20 3d 20 64 62 5f 67 65 74 28  ojName = db_get(
2530: 22 70 72 6f 6a 65 63 74 2d 6e 61 6d 65 22 2c 20  "project-name", 
2540: 22 75 6e 6e 61 6d 65 64 22 29 3b 0a 20 20 20 20  "unnamed");.    
2550: 20 20 40 20 3c 74 72 3e 3c 74 68 3e 54 69 6d 65    @ <tr><th>Time
2560: 6c 69 6e 65 73 3a 3c 2f 74 68 3e 3c 74 64 3e 0a  lines:</th><td>.
2570: 20 20 20 20 20 20 40 20 20 20 20 3c 61 20 68 72        @    <a hr
2580: 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52  ef="%s(g.zBaseUR
2590: 4c 29 2f 74 69 6d 65 6c 69 6e 65 3f 70 3d 25 64  L)/timeline?p=%d
25a0: 28 72 69 64 29 22 3e 61 6e 63 65 73 74 6f 72 73  (rid)">ancestors
25b0: 3c 2f 61 3e 0a 20 20 20 20 20 20 40 20 20 20 20  </a>.      @    
25c0: 7c 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e  | <a href="%s(g.
25d0: 7a 42 61 73 65 55 52 4c 29 2f 74 69 6d 65 6c 69  zBaseURL)/timeli
25e0: 6e 65 3f 64 3d 25 64 28 72 69 64 29 22 3e 64 65  ne?d=%d(rid)">de
25f0: 73 63 65 6e 64 61 6e 74 73 3c 2f 61 3e 0a 20 20  scendants</a>.  
2600: 20 20 20 20 40 20 20 20 20 7c 20 3c 61 20 68 72      @    | <a hr
2610: 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52  ef="%s(g.zBaseUR
2620: 4c 29 2f 74 69 6d 65 6c 69 6e 65 3f 64 3d 25 64  L)/timeline?d=%d
2630: 28 72 69 64 29 26 70 3d 25 64 28 72 69 64 29 22  (rid)&p=%d(rid)"
2640: 3e 62 6f 74 68 3c 2f 61 3e 0a 20 20 20 20 20 20  >both</a>.      
2650: 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 22  db_prepare(&q, "
2660: 53 45 4c 45 43 54 20 73 75 62 73 74 72 28 74 61  SELECT substr(ta
2670: 67 2e 74 61 67 6e 61 6d 65 2c 35 29 20 46 52 4f  g.tagname,5) FRO
2680: 4d 20 74 61 67 78 72 65 66 2c 20 74 61 67 20 22  M tagxref, tag "
2690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26a0: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 72 69        " WHERE ri
26b0: 64 3d 25 64 20 41 4e 44 20 74 61 67 74 79 70 65  d=%d AND tagtype
26c0: 3e 30 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  >0 ".           
26d0: 20 20 20 20 20 20 20 20 20 20 22 20 20 20 41 4e            "   AN
26e0: 44 20 74 61 67 2e 74 61 67 69 64 3d 74 61 67 78  D tag.tagid=tagx
26f0: 72 65 66 2e 74 61 67 69 64 20 22 0a 20 20 20 20  ref.tagid ".    
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2710: 20 22 20 20 20 41 4e 44 20 2b 74 61 67 2e 74 61   "   AND +tag.ta
2720: 67 6e 61 6d 65 20 47 4c 4f 42 20 27 73 79 6d 2d  gname GLOB 'sym-
2730: 2a 27 22 2c 20 72 69 64 29 3b 0a 20 20 20 20 20  *'", rid);.     
2740: 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28   while( db_step(
2750: 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  &q)==SQLITE_ROW 
2760: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
2770: 20 63 68 61 72 20 2a 7a 54 61 67 4e 61 6d 65 20   char *zTagName 
2780: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
2790: 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  (&q, 0);.       
27a0: 20 40 20 20 7c 20 3c 61 20 68 72 65 66 3d 22 25   @  | <a href="%
27b0: 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 74 69  s(g.zBaseURL)/ti
27c0: 6d 65 6c 69 6e 65 3f 74 3d 25 54 28 7a 54 61 67  meline?t=%T(zTag
27d0: 4e 61 6d 65 29 22 3e 25 68 28 7a 54 61 67 4e 61  Name)">%h(zTagNa
27e0: 6d 65 29 3c 2f 61 3e 0a 20 20 20 20 20 20 7d 0a  me)</a>.      }.
27f0: 20 20 20 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a        db_finaliz
2800: 65 28 26 71 29 3b 0a 20 20 20 20 20 20 40 20 3c  e(&q);.      @ <
2810: 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 20 20 20 20  /td></tr>.      
2820: 40 20 3c 74 72 3e 3c 74 68 3e 4f 74 68 65 72 26  @ <tr><th>Other&
2830: 6e 62 73 70 3b 4c 69 6e 6b 73 3a 3c 2f 74 68 3e  nbsp;Links:</th>
2840: 0a 20 20 20 20 20 20 40 20 20 20 3c 74 64 3e 0a  .      @   <td>.
2850: 20 20 20 20 20 20 40 20 20 20 20 20 3c 61 20 68        @     <a h
2860: 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55  ref="%s(g.zBaseU
2870: 52 4c 29 2f 64 69 72 3f 63 69 3d 25 73 28 7a 53  RL)/dir?ci=%s(zS
2880: 68 6f 72 74 55 75 69 64 29 22 3e 66 69 6c 65 73  hortUuid)">files
2890: 3c 2f 61 3e 0a 20 20 20 20 20 20 40 20 20 20 20  </a>.      @    
28a0: 20 7c 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67   | <a href="%s(g
28b0: 2e 7a 42 61 73 65 55 52 4c 29 2f 7a 69 70 2f 25  .zBaseURL)/zip/%
28c0: 73 28 7a 50 72 6f 6a 4e 61 6d 65 29 2d 25 73 28  s(zProjName)-%s(
28d0: 7a 53 68 6f 72 74 55 75 69 64 29 2e 7a 69 70 3f  zShortUuid).zip?
28e0: 75 75 69 64 3d 25 73 28 7a 55 75 69 64 29 22 3e  uuid=%s(zUuid)">
28f0: 0a 20 20 20 20 20 20 40 20 20 20 20 20 20 20 20  .      @        
2900: 20 5a 49 50 20 61 72 63 68 69 76 65 3c 2f 61 3e   ZIP archive</a>
2910: 0a 20 20 20 20 20 20 40 20 20 20 20 20 7c 20 3c  .      @     | <
2920: 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61  a href="%s(g.zBa
2930: 73 65 55 52 4c 29 2f 61 72 74 69 66 61 63 74 2f  seURL)/artifact/
2940: 25 64 28 72 69 64 29 22 3e 6d 61 6e 69 66 65 73  %d(rid)">manifes
2950: 74 3c 2f 61 3e 0a 20 20 20 20 20 20 69 66 28 20  t</a>.      if( 
2960: 67 2e 6f 6b 57 72 69 74 65 20 29 7b 0a 20 20 20  g.okWrite ){.   
2970: 20 20 20 20 20 40 20 20 20 20 20 7c 20 3c 61 20       @     | <a 
2980: 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65  href="%s(g.zBase
2990: 55 52 4c 29 2f 63 69 5f 65 64 69 74 3f 72 3d 25  URL)/ci_edit?r=%
29a0: 64 28 72 69 64 29 22 3e 65 64 69 74 3c 2f 61 3e  d(rid)">edit</a>
29b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 40  .      }.      @
29c0: 20 20 20 3c 2f 74 64 3e 0a 20 20 20 20 20 20 40     </td>.      @
29d0: 20 3c 2f 74 72 3e 0a 20 20 20 20 20 20 66 72 65   </tr>.      fre
29e0: 65 28 7a 53 68 6f 72 74 55 75 69 64 29 3b 0a 20  e(zShortUuid);. 
29f0: 20 20 20 7d 0a 20 20 20 20 40 20 3c 2f 74 61 62     }.    @ </tab
2a00: 6c 65 3e 3c 2f 70 3e 0a 20 20 7d 65 6c 73 65 7b  le></p>.  }else{
2a10: 0a 20 20 20 20 73 74 79 6c 65 5f 68 65 61 64 65  .    style_heade
2a20: 72 28 22 43 68 65 63 6b 2d 69 6e 20 49 6e 66 6f  r("Check-in Info
2a30: 72 6d 61 74 69 6f 6e 22 29 3b 0a 20 20 20 20 6c  rmation");.    l
2a40: 6f 67 69 6e 5f 61 6e 6f 6e 79 6d 6f 75 73 5f 61  ogin_anonymous_a
2a50: 76 61 69 6c 61 62 6c 65 28 29 3b 0a 20 20 7d 0a  vailable();.  }.
2a60: 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71    db_finalize(&q
2a70: 29 3b 0a 20 20 73 68 6f 77 54 61 67 73 28 72 69  );.  showTags(ri
2a80: 64 2c 20 22 22 29 3b 0a 20 20 40 20 3c 64 69 76  d, "");.  @ <div
2a90: 20 63 6c 61 73 73 3d 22 73 65 63 74 69 6f 6e 22   class="section"
2aa0: 3e 43 68 61 6e 67 65 73 3c 2f 64 69 76 3e 0a 20  >Changes</div>. 
2ab0: 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 0a   db_prepare(&q,.
2ac0: 20 20 20 20 20 22 53 45 4c 45 43 54 20 70 69 64       "SELECT pid
2ad0: 2c 20 66 69 64 2c 20 6e 61 6d 65 2c 20 73 75 62  , fid, name, sub
2ae0: 73 74 72 28 61 2e 75 75 69 64 2c 31 2c 31 30 29  str(a.uuid,1,10)
2af0: 2c 20 73 75 62 73 74 72 28 62 2e 75 75 69 64 2c  , substr(b.uuid,
2b00: 31 2c 31 30 29 22 0a 20 20 20 20 20 22 20 20 46  1,10)".     "  F
2b10: 52 4f 4d 20 6d 6c 69 6e 6b 20 4a 4f 49 4e 20 66  ROM mlink JOIN f
2b20: 69 6c 65 6e 61 6d 65 20 4f 4e 20 66 69 6c 65 6e  ilename ON filen
2b30: 61 6d 65 2e 66 6e 69 64 3d 6d 6c 69 6e 6b 2e 66  ame.fnid=mlink.f
2b40: 6e 69 64 22 0a 20 20 20 20 20 22 20 20 20 20 20  nid".     "     
2b50: 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 62 6c      LEFT JOIN bl
2b60: 6f 62 20 61 20 4f 4e 20 61 2e 72 69 64 3d 70 69  ob a ON a.rid=pi
2b70: 64 22 0a 20 20 20 20 20 22 20 20 20 20 20 20 20  d".     "       
2b80: 20 20 4c 45 46 54 20 4a 4f 49 4e 20 62 6c 6f 62    LEFT JOIN blob
2b90: 20 62 20 4f 4e 20 62 2e 72 69 64 3d 66 69 64 22   b ON b.rid=fid"
2ba0: 0a 20 20 20 20 20 22 20 57 48 45 52 45 20 6d 6c  .     " WHERE ml
2bb0: 69 6e 6b 2e 6d 69 64 3d 25 64 22 0a 20 20 20 20  ink.mid=%d".    
2bc0: 20 22 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65   " ORDER BY name
2bd0: 22 2c 0a 20 20 20 20 20 72 69 64 0a 20 20 29 3b  ",.     rid.  );
2be0: 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65  .  while( db_ste
2bf0: 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  p(&q)==SQLITE_RO
2c00: 57 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 69 64  W ){.    int pid
2c10: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   = db_column_int
2c20: 28 26 71 2c 30 29 3b 0a 20 20 20 20 69 6e 74 20  (&q,0);.    int 
2c30: 66 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  fid = db_column_
2c40: 69 6e 74 28 26 71 2c 31 29 3b 0a 20 20 20 20 63  int(&q,1);.    c
2c50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
2c60: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78   = db_column_tex
2c70: 74 28 26 71 2c 32 29 3b 0a 20 20 20 20 63 6f 6e  t(&q,2);.    con
2c80: 73 74 20 63 68 61 72 20 2a 7a 4f 6c 64 20 3d 20  st char *zOld = 
2c90: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
2ca0: 71 2c 33 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  q,3);.    const 
2cb0: 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20 64 62 5f  char *zNew = db_
2cc0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 34  column_text(&q,4
2cd0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4f 6c 64 20  );.    if( zOld 
2ce0: 26 26 20 7a 4e 65 77 20 29 7b 0a 20 20 20 20 20  && zNew ){.     
2cf0: 20 40 20 3c 70 3e 4d 6f 64 69 66 69 65 64 20 3c   @ <p>Modified <
2d00: 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61  a href="%s(g.zBa
2d10: 73 65 55 52 4c 29 2f 66 69 6e 66 6f 3f 6e 61 6d  seURL)/finfo?nam
2d20: 65 3d 25 54 28 7a 4e 61 6d 65 29 22 3e 25 68 28  e=%T(zName)">%h(
2d30: 7a 4e 61 6d 65 29 3c 2f 61 3e 0a 20 20 20 20 20  zName)</a>.     
2d40: 20 40 20 66 72 6f 6d 20 3c 61 20 68 72 65 66 3d   @ from <a href=
2d50: 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f  "%s(g.zBaseURL)/
2d60: 61 72 74 69 66 61 63 74 2f 25 73 28 7a 4f 6c 64  artifact/%s(zOld
2d70: 29 22 3e 5b 25 73 28 7a 4f 6c 64 29 5d 3c 2f 61  )">[%s(zOld)]</a
2d80: 3e 0a 20 20 20 20 20 20 40 20 74 6f 20 3c 61 20  >.      @ to <a 
2d90: 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65  href="%s(g.zBase
2da0: 55 52 4c 29 2f 61 72 74 69 66 61 63 74 2f 25 73  URL)/artifact/%s
2db0: 28 7a 4e 65 77 29 22 3e 5b 25 73 28 7a 4e 65 77  (zNew)">[%s(zNew
2dc0: 29 5d 3c 2f 61 3e 3c 2f 70 3e 0a 20 20 20 20 7d  )]</a></p>.    }
2dd0: 65 6c 73 65 20 69 66 28 20 7a 4f 6c 64 20 29 7b  else if( zOld ){
2de0: 0a 20 20 20 20 20 20 40 20 3c 70 3e 44 65 6c 65  .      @ <p>Dele
2df0: 74 65 64 20 3c 61 20 68 72 65 66 3d 22 25 73 28  ted <a href="%s(
2e00: 67 2e 7a 42 61 73 65 55 52 4c 29 2f 66 69 6e 66  g.zBaseURL)/finf
2e10: 6f 3f 6e 61 6d 65 3d 25 54 28 7a 4e 61 6d 65 29  o?name=%T(zName)
2e20: 22 3e 25 68 28 7a 4e 61 6d 65 29 3c 2f 61 3e 0a  ">%h(zName)</a>.
2e30: 20 20 20 20 20 20 40 20 76 65 72 73 69 6f 6e 20        @ version 
2e40: 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42  <a href="%s(g.zB
2e50: 61 73 65 55 52 4c 29 2f 61 72 74 69 66 61 63 74  aseURL)/artifact
2e60: 2f 25 73 28 7a 4f 6c 64 29 22 3e 5b 25 73 28 7a  /%s(zOld)">[%s(z
2e70: 4f 6c 64 29 5d 3c 2f 61 3e 3c 2f 70 3e 0a 20 20  Old)]</a></p>.  
2e80: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2e90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 40    }else{.      @
2ea0: 20 3c 70 3e 41 64 64 65 64 20 3c 61 20 68 72 65   <p>Added <a hre
2eb0: 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c  f="%s(g.zBaseURL
2ec0: 29 2f 66 69 6e 66 6f 3f 6e 61 6d 65 3d 25 54 28  )/finfo?name=%T(
2ed0: 7a 4e 61 6d 65 29 22 3e 25 68 28 7a 4e 61 6d 65  zName)">%h(zName
2ee0: 29 3c 2f 61 3e 0a 20 20 20 20 20 20 40 20 76 65  )</a>.      @ ve
2ef0: 72 73 69 6f 6e 20 3c 61 20 68 72 65 66 3d 22 25  rsion <a href="%
2f00: 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 61 72  s(g.zBaseURL)/ar
2f10: 74 69 66 61 63 74 2f 25 73 28 7a 4e 65 77 29 22  tifact/%s(zNew)"
2f20: 3e 5b 25 73 28 7a 4e 65 77 29 5d 3c 2f 61 3e 3c  >[%s(zNew)]</a><
2f30: 2f 70 3e 0a 20 20 20 20 7d 0a 20 20 20 20 40 20  /p>.    }.    @ 
2f40: 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65  <blockquote><pre
2f50: 3e 0a 20 20 20 20 61 70 70 65 6e 64 5f 64 69 66  >.    append_dif
2f60: 66 28 70 69 64 2c 20 66 69 64 29 3b 0a 20 20 20  f(pid, fid);.   
2f70: 20 40 20 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b   @ </pre></block
2f80: 71 75 6f 74 65 3e 0a 20 20 7d 0a 20 20 64 62 5f  quote>.  }.  db_
2f90: 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20  finalize(&q);.  
2fa0: 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a  style_footer();.
2fb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45  }../*.** WEBPAGE
2fc0: 3a 20 77 69 6e 66 6f 0a 2a 2a 20 55 52 4c 3a 20  : winfo.** URL: 
2fd0: 20 2f 77 69 6e 66 6f 3f 6e 61 6d 65 3d 52 49 44   /winfo?name=RID
2fe0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 69 6e  .**.** Return in
2ff0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
3000: 61 20 77 69 6b 69 20 70 61 67 65 2e 0a 2a 2f 0a  a wiki page..*/.
3010: 76 6f 69 64 20 77 69 6e 66 6f 5f 70 61 67 65 28  void winfo_page(
3020: 76 6f 69 64 29 7b 0a 20 20 53 74 6d 74 20 71 3b  void){.  Stmt q;
3030: 0a 20 20 69 6e 74 20 72 69 64 3b 0a 0a 20 20 6c  .  int rid;..  l
3040: 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65  ogin_check_crede
3050: 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28 20  ntials();.  if( 
3060: 21 67 2e 6f 6b 52 64 57 69 6b 69 20 29 7b 20 6c  !g.okRdWiki ){ l
3070: 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b 20 72  ogin_needed(); r
3080: 65 74 75 72 6e 3b 20 7d 0a 20 20 72 69 64 20 3d  eturn; }.  rid =
3090: 20 6e 61 6d 65 5f 74 6f 5f 72 69 64 28 50 44 28   name_to_rid(PD(
30a0: 22 6e 61 6d 65 22 2c 22 30 22 29 29 3b 0a 20 20  "name","0"));.  
30b0: 69 66 28 20 72 69 64 3d 3d 30 20 29 7b 0a 20 20  if( rid==0 ){.  
30c0: 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22    style_header("
30d0: 57 69 6b 69 20 50 61 67 65 20 49 6e 66 6f 72 6d  Wiki Page Inform
30e0: 61 74 69 6f 6e 20 45 72 72 6f 72 22 29 3b 0a 20  ation Error");. 
30f0: 20 20 20 40 20 4e 6f 20 73 75 63 68 20 6f 62 6a     @ No such obj
3100: 65 63 74 3a 20 25 68 28 67 2e 61 72 67 76 5b 32  ect: %h(g.argv[2
3110: 5d 29 0a 20 20 20 20 73 74 79 6c 65 5f 66 6f 6f  ]).    style_foo
3120: 74 65 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72  ter();.    retur
3130: 6e 3b 0a 20 20 7d 0a 20 20 64 62 5f 70 72 65 70  n;.  }.  db_prep
3140: 61 72 65 28 26 71 2c 20 0a 20 20 20 20 20 22 53  are(&q, .     "S
3150: 45 4c 45 43 54 20 73 75 62 73 74 72 28 74 61 67  ELECT substr(tag
3160: 6e 61 6d 65 2c 20 36 2c 20 31 30 30 30 29 2c 20  name, 6, 1000), 
3170: 75 75 69 64 2c 22 0a 20 20 20 20 20 22 20 20 20  uuid,".     "   
3180: 20 20 20 20 64 61 74 65 74 69 6d 65 28 65 76 65      datetime(eve
3190: 6e 74 2e 6d 74 69 6d 65 2c 20 27 6c 6f 63 61 6c  nt.mtime, 'local
31a0: 74 69 6d 65 27 29 2c 20 75 73 65 72 22 0a 20 20  time'), user".  
31b0: 20 20 20 22 20 20 46 52 4f 4d 20 74 61 67 78 72     "  FROM tagxr
31c0: 65 66 2c 20 74 61 67 2c 20 62 6c 6f 62 2c 20 65  ef, tag, blob, e
31d0: 76 65 6e 74 22 0a 20 20 20 20 20 22 20 57 48 45  vent".     " WHE
31e0: 52 45 20 74 61 67 78 72 65 66 2e 72 69 64 3d 25  RE tagxref.rid=%
31f0: 64 22 0a 20 20 20 20 20 22 20 20 20 41 4e 44 20  d".     "   AND 
3200: 74 61 67 2e 74 61 67 69 64 3d 74 61 67 78 72 65  tag.tagid=tagxre
3210: 66 2e 74 61 67 69 64 22 0a 20 20 20 20 20 22 20  f.tagid".     " 
3220: 20 20 41 4e 44 20 74 61 67 2e 74 61 67 6e 61 6d    AND tag.tagnam
3230: 65 20 4c 49 4b 45 20 27 77 69 6b 69 2d 25 25 27  e LIKE 'wiki-%%'
3240: 22 0a 20 20 20 20 20 22 20 20 20 41 4e 44 20 62  ".     "   AND b
3250: 6c 6f 62 2e 72 69 64 3d 25 64 22 0a 20 20 20 20  lob.rid=%d".    
3260: 20 22 20 20 20 41 4e 44 20 65 76 65 6e 74 2e 6f   "   AND event.o
3270: 62 6a 69 64 3d 25 64 22 2c 0a 20 20 20 20 20 72  bjid=%d",.     r
3280: 69 64 2c 20 72 69 64 2c 20 72 69 64 0a 20 20 29  id, rid, rid.  )
3290: 3b 0a 20 20 69 66 28 20 64 62 5f 73 74 65 70 28  ;.  if( db_step(
32a0: 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  &q)==SQLITE_ROW 
32b0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
32c0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 64 62 5f 63 6f  r *zName = db_co
32d0: 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 30 29  lumn_text(&q, 0)
32e0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
32f0: 20 2a 7a 55 75 69 64 20 3d 20 64 62 5f 63 6f 6c   *zUuid = db_col
3300: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31 29 3b  umn_text(&q, 1);
3310: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 69 74 6c  .    char *zTitl
3320: 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 57 69 6b  e = mprintf("Wik
3330: 69 20 50 61 67 65 20 25 73 22 2c 20 7a 4e 61 6d  i Page %s", zNam
3340: 65 29 3b 0a 20 20 20 20 73 74 79 6c 65 5f 68 65  e);.    style_he
3350: 61 64 65 72 28 7a 54 69 74 6c 65 29 3b 0a 20 20  ader(zTitle);.  
3360: 20 20 66 72 65 65 28 7a 54 69 74 6c 65 29 3b 0a    free(zTitle);.
3370: 20 20 20 20 6c 6f 67 69 6e 5f 61 6e 6f 6e 79 6d      login_anonym
3380: 6f 75 73 5f 61 76 61 69 6c 61 62 6c 65 28 29 3b  ous_available();
3390: 0a 20 20 20 20 40 20 3c 64 69 76 20 63 6c 61 73  .    @ <div clas
33a0: 73 3d 22 73 65 63 74 69 6f 6e 22 3e 4f 76 65 72  s="section">Over
33b0: 76 69 65 77 3c 2f 64 69 76 3e 0a 20 20 20 20 40  view</div>.    @
33c0: 20 3c 70 3e 3c 74 61 62 6c 65 20 63 6c 61 73 73   <p><table class
33d0: 3d 22 6c 61 62 65 6c 2d 76 61 6c 75 65 22 3e 0a  ="label-value">.
33e0: 20 20 20 20 40 20 3c 74 72 3e 3c 74 68 3e 56 65      @ <tr><th>Ve
33f0: 72 73 69 6f 6e 3a 3c 2f 74 68 3e 3c 74 64 3e 25  rsion:</th><td>%
3400: 73 28 7a 55 75 69 64 29 3c 2f 74 64 3e 3c 2f 74  s(zUuid)</td></t
3410: 72 3e 0a 20 20 20 20 40 20 3c 74 72 3e 3c 74 68  r>.    @ <tr><th
3420: 3e 44 61 74 65 3a 3c 2f 74 68 3e 3c 74 64 3e 25  >Date:</th><td>%
3430: 73 28 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  s(db_column_text
3440: 28 26 71 2c 20 32 29 29 3c 2f 74 64 3e 3c 2f 74  (&q, 2))</td></t
3450: 72 3e 0a 20 20 20 20 69 66 28 20 67 2e 6f 6b 53  r>.    if( g.okS
3460: 65 74 75 70 20 29 7b 0a 20 20 20 20 20 20 40 20  etup ){.      @ 
3470: 3c 74 72 3e 3c 74 68 3e 52 65 63 6f 72 64 20 49  <tr><th>Record I
3480: 44 3a 3c 2f 74 68 3e 3c 74 64 3e 25 64 28 72 69  D:</th><td>%d(ri
3490: 64 29 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 20  d)</td></tr>.   
34a0: 20 7d 0a 20 20 20 20 40 20 3c 74 72 3e 3c 74 68   }.    @ <tr><th
34b0: 3e 4f 72 69 67 69 6e 61 6c 26 6e 62 73 70 3b 55  >Original&nbsp;U
34c0: 73 65 72 3a 3c 2f 74 68 3e 3c 74 64 3e 25 73 28  ser:</th><td>%s(
34d0: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
34e0: 71 2c 20 33 29 29 3c 2f 74 64 3e 3c 2f 74 72 3e  q, 3))</td></tr>
34f0: 0a 20 20 20 20 69 66 28 20 67 2e 6f 6b 48 69 73  .    if( g.okHis
3500: 74 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 40 20  tory ){.      @ 
3510: 3c 74 72 3e 3c 74 68 3e 43 6f 6d 6d 61 6e 64 73  <tr><th>Commands
3520: 3a 3c 2f 74 68 3e 0a 20 20 20 20 20 20 40 20 20  :</th>.      @  
3530: 20 3c 74 64 3e 0a 20 20 20 20 20 20 2f 2a 20 40   <td>.      /* @
3540: 20 20 20 20 20 3c 61 20 68 72 65 66 3d 22 25 73       <a href="%s
3550: 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 77 64 69  (g.zBaseURL)/wdi
3560: 66 66 2f 25 64 28 72 69 64 29 22 3e 64 69 66 66  ff/%d(rid)">diff
3570: 3c 2f 61 3e 20 7c 20 2a 2f 0a 20 20 20 20 20 20  </a> | */.      
3580: 40 20 20 20 20 20 3c 61 20 68 72 65 66 3d 22 25  @     <a href="%
3590: 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 77 68  s(g.zBaseURL)/wh
35a0: 69 73 74 6f 72 79 3f 6e 61 6d 65 3d 25 74 28 7a  istory?name=%t(z
35b0: 4e 61 6d 65 29 22 3e 68 69 73 74 6f 72 79 3c 2f  Name)">history</
35c0: 61 3e 0a 20 20 20 20 20 20 40 20 20 20 20 20 7c  a>.      @     |
35d0: 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a   <a href="%s(g.z
35e0: 42 61 73 65 55 52 4c 29 2f 61 72 74 69 66 61 63  BaseURL)/artifac
35f0: 74 2f 25 64 28 72 69 64 29 22 3e 72 61 77 2d 74  t/%d(rid)">raw-t
3600: 65 78 74 3c 2f 61 3e 0a 20 20 20 20 20 20 40 20  ext</a>.      @ 
3610: 20 20 3c 2f 74 64 3e 0a 20 20 20 20 20 20 40 20    </td>.      @ 
3620: 3c 2f 74 72 3e 0a 20 20 20 20 7d 0a 20 20 20 20  </tr>.    }.    
3630: 40 20 3c 2f 74 61 62 6c 65 3e 3c 2f 70 3e 0a 20  @ </table></p>. 
3640: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 79 6c   }else{.    styl
3650: 65 5f 68 65 61 64 65 72 28 22 57 69 6b 69 20 49  e_header("Wiki I
3660: 6e 66 6f 72 6d 61 74 69 6f 6e 22 29 3b 0a 20 20  nformation");.  
3670: 20 20 72 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 20    rid = 0;.  }. 
3680: 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29   db_finalize(&q)
3690: 3b 0a 20 20 73 68 6f 77 54 61 67 73 28 72 69 64  ;.  showTags(rid
36a0: 2c 20 22 77 69 6b 69 2d 2a 22 29 3b 0a 20 20 69  , "wiki-*");.  i
36b0: 66 28 20 72 69 64 20 29 7b 0a 20 20 20 20 42 6c  f( rid ){.    Bl
36c0: 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a 20 20 20 20  ob content;.    
36d0: 4d 61 6e 69 66 65 73 74 20 6d 3b 0a 20 20 20 20  Manifest m;.    
36e0: 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69  memset(&m, 0, si
36f0: 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 20 20 62 6c  zeof(m));.    bl
3700: 6f 62 5f 7a 65 72 6f 28 26 6d 2e 63 6f 6e 74 65  ob_zero(&m.conte
3710: 6e 74 29 3b 0a 20 20 20 20 63 6f 6e 74 65 6e 74  nt);.    content
3720: 5f 67 65 74 28 72 69 64 2c 20 26 63 6f 6e 74 65  _get(rid, &conte
3730: 6e 74 29 3b 0a 20 20 20 20 6d 61 6e 69 66 65 73  nt);.    manifes
3740: 74 5f 70 61 72 73 65 28 26 6d 2c 20 26 63 6f 6e  t_parse(&m, &con
3750: 74 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 6d  tent);.    if( m
3760: 2e 74 79 70 65 3d 3d 43 46 54 59 50 45 5f 57 49  .type==CFTYPE_WI
3770: 4b 49 20 29 7b 0a 20 20 20 20 20 20 42 6c 6f 62  KI ){.      Blob
3780: 20 77 69 6b 69 3b 0a 20 20 20 20 20 20 62 6c 6f   wiki;.      blo
3790: 62 5f 69 6e 69 74 28 26 77 69 6b 69 2c 20 6d 2e  b_init(&wiki, m.
37a0: 7a 57 69 6b 69 2c 20 2d 31 29 3b 0a 20 20 20 20  zWiki, -1);.    
37b0: 20 20 40 20 3c 64 69 76 20 63 6c 61 73 73 3d 22    @ <div class="
37c0: 73 65 63 74 69 6f 6e 22 3e 43 6f 6e 74 65 6e 74  section">Content
37d0: 3c 2f 64 69 76 3e 0a 20 20 20 20 20 20 77 69 6b  </div>.      wik
37e0: 69 5f 63 6f 6e 76 65 72 74 28 26 77 69 6b 69 2c  i_convert(&wiki,
37f0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 6c   0, 0);.      bl
3800: 6f 62 5f 72 65 73 65 74 28 26 77 69 6b 69 29 3b  ob_reset(&wiki);
3810: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 61 6e 69 66  .    }.    manif
3820: 65 73 74 5f 63 6c 65 61 72 28 26 6d 29 3b 0a 20  est_clear(&m);. 
3830: 20 7d 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65   }.  style_foote
3840: 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45  r();.}../*.** WE
3850: 42 50 41 47 45 3a 20 66 69 6e 66 6f 0a 2a 2a 20  BPAGE: finfo.** 
3860: 55 52 4c 3a 20 2f 66 69 6e 66 6f 3f 6e 61 6d 65  URL: /finfo?name
3870: 3d 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20  =FILENAME.**.** 
3880: 53 68 6f 77 20 74 68 65 20 63 6f 6d 70 6c 65 74  Show the complet
3890: 65 20 63 68 61 6e 67 65 20 68 69 73 74 6f 72 79  e change history
38a0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 66 69   for a single fi
38b0: 6c 65 2e 20 0a 2a 2f 0a 76 6f 69 64 20 66 69 6e  le. .*/.void fin
38c0: 66 6f 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20  fo_page(void){. 
38d0: 20 53 74 6d 74 20 71 3b 0a 20 20 63 6f 6e 73 74   Stmt q;.  const
38e0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
38f0: 3b 0a 20 20 63 68 61 72 20 7a 50 72 65 76 44 61  ;.  char zPrevDa
3900: 74 65 5b 32 30 5d 3b 0a 20 20 42 6c 6f 62 20 74  te[20];.  Blob t
3910: 69 74 6c 65 3b 0a 0a 20 20 6c 6f 67 69 6e 5f 63  itle;..  login_c
3920: 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73  heck_credentials
3930: 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b 52  ();.  if( !g.okR
3940: 65 61 64 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65  ead ){ login_nee
3950: 64 65 64 28 29 3b 20 72 65 74 75 72 6e 3b 20 7d  ded(); return; }
3960: 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28  .  style_header(
3970: 22 46 69 6c 65 20 48 69 73 74 6f 72 79 22 29 3b  "File History");
3980: 0a 20 20 6c 6f 67 69 6e 5f 61 6e 6f 6e 79 6d 6f  .  login_anonymo
3990: 75 73 5f 61 76 61 69 6c 61 62 6c 65 28 29 3b 0a  us_available();.
39a0: 0a 20 20 7a 50 72 65 76 44 61 74 65 5b 30 5d 20  .  zPrevDate[0] 
39b0: 3d 20 30 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  = 0;.  zFilename
39c0: 20 3d 20 50 44 28 22 6e 61 6d 65 22 2c 22 22 29   = PD("name","")
39d0: 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26  ;.  db_prepare(&
39e0: 71 2c 0a 20 20 20 20 22 53 45 4c 45 43 54 20 73  q,.    "SELECT s
39f0: 75 62 73 74 72 28 62 2e 75 75 69 64 2c 31 2c 31  ubstr(b.uuid,1,1
3a00: 30 29 2c 20 64 61 74 65 74 69 6d 65 28 65 76 65  0), datetime(eve
3a10: 6e 74 2e 6d 74 69 6d 65 2c 27 6c 6f 63 61 6c 74  nt.mtime,'localt
3a20: 69 6d 65 27 29 2c 22 0a 20 20 20 20 22 20 20 20  ime'),".    "   
3a30: 20 20 20 20 63 6f 61 6c 65 73 63 65 28 65 76 65      coalesce(eve
3a40: 6e 74 2e 65 63 6f 6d 6d 65 6e 74 2c 20 65 76 65  nt.ecomment, eve
3a50: 6e 74 2e 63 6f 6d 6d 65 6e 74 29 2c 22 0a 20 20  nt.comment),".  
3a60: 20 20 22 20 20 20 20 20 20 20 63 6f 61 6c 65 73    "       coales
3a70: 63 65 28 65 76 65 6e 74 2e 65 75 73 65 72 2c 20  ce(event.euser, 
3a80: 65 76 65 6e 74 2e 75 73 65 72 29 2c 22 0a 20 20  event.user),".  
3a90: 20 20 22 20 20 20 20 20 20 20 6d 6c 69 6e 6b 2e    "       mlink.
3aa0: 70 69 64 2c 20 6d 6c 69 6e 6b 2e 66 69 64 2c 20  pid, mlink.fid, 
3ab0: 6d 6c 69 6e 6b 2e 6d 69 64 2c 20 6d 6c 69 6e 6b  mlink.mid, mlink
3ac0: 2e 66 6e 69 64 22 0a 20 20 20 20 22 20 20 46 52  .fnid".    "  FR
3ad0: 4f 4d 20 6d 6c 69 6e 6b 2c 20 62 6c 6f 62 20 62  OM mlink, blob b
3ae0: 2c 20 65 76 65 6e 74 22 0a 20 20 20 20 22 20 57  , event".    " W
3af0: 48 45 52 45 20 6d 6c 69 6e 6b 2e 66 6e 69 64 3d  HERE mlink.fnid=
3b00: 28 53 45 4c 45 43 54 20 66 6e 69 64 20 46 52 4f  (SELECT fnid FRO
3b10: 4d 20 66 69 6c 65 6e 61 6d 65 20 57 48 45 52 45  M filename WHERE
3b20: 20 6e 61 6d 65 3d 25 51 29 22 0a 20 20 20 20 22   name=%Q)".    "
3b30: 20 20 20 41 4e 44 20 62 2e 72 69 64 3d 6d 6c 69     AND b.rid=mli
3b40: 6e 6b 2e 66 69 64 22 0a 20 20 20 20 22 20 20 20  nk.fid".    "   
3b50: 41 4e 44 20 65 76 65 6e 74 2e 6f 62 6a 69 64 3d  AND event.objid=
3b60: 6d 6c 69 6e 6b 2e 6d 69 64 22 0a 20 20 20 20 22  mlink.mid".    "
3b70: 20 4f 52 44 45 52 20 42 59 20 65 76 65 6e 74 2e   ORDER BY event.
3b80: 6d 74 69 6d 65 20 44 45 53 43 22 2c 0a 20 20 20  mtime DESC",.   
3b90: 20 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 29 3b 0a   zFilename.  );.
3ba0: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 74 69 74    blob_zero(&tit
3bb0: 6c 65 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65  le);.  blob_appe
3bc0: 6e 64 66 28 26 74 69 74 6c 65 2c 20 22 48 69 73  ndf(&title, "His
3bd0: 74 6f 72 79 20 6f 66 20 22 29 3b 0a 20 20 68 79  tory of ");.  hy
3be0: 70 65 72 6c 69 6e 6b 65 64 5f 70 61 74 68 28 7a  perlinked_path(z
3bf0: 46 69 6c 65 6e 61 6d 65 2c 20 26 74 69 74 6c 65  Filename, &title
3c00: 29 3b 0a 20 20 40 20 3c 68 32 3e 25 62 28 26 74  );.  @ <h2>%b(&t
3c10: 69 74 6c 65 29 3c 2f 68 32 3e 0a 20 20 62 6c 6f  itle)</h2>.  blo
3c20: 62 5f 72 65 73 65 74 28 26 74 69 74 6c 65 29 3b  b_reset(&title);
3c30: 0a 20 20 40 20 3c 74 61 62 6c 65 20 63 65 6c 6c  .  @ <table cell
3c40: 73 70 61 63 69 6e 67 3d 30 20 62 6f 72 64 65 72  spacing=0 border
3c50: 3d 30 20 63 65 6c 6c 70 61 64 64 69 6e 67 3d 30  =0 cellpadding=0
3c60: 3e 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74  >.  while( db_st
3c70: 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52  ep(&q)==SQLITE_R
3c80: 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OW ){.    const 
3c90: 63 68 61 72 20 2a 7a 55 75 69 64 20 3d 20 64 62  char *zUuid = db
3ca0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c  _column_text(&q,
3cb0: 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63   0);.    const c
3cc0: 68 61 72 20 2a 7a 44 61 74 65 20 3d 20 64 62 5f  har *zDate = db_
3cd0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
3ce0: 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  1);.    const ch
3cf0: 61 72 20 2a 7a 43 6f 6d 20 3d 20 64 62 5f 63 6f  ar *zCom = db_co
3d00: 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 32 29  lumn_text(&q, 2)
3d10: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
3d20: 20 2a 7a 55 73 65 72 20 3d 20 64 62 5f 63 6f 6c   *zUser = db_col
3d30: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 33 29 3b  umn_text(&q, 3);
3d40: 0a 20 20 20 20 69 6e 74 20 66 70 69 64 20 3d 20  .    int fpid = 
3d50: 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71  db_column_int(&q
3d60: 2c 20 34 29 3b 0a 20 20 20 20 69 6e 74 20 66 72  , 4);.    int fr
3d70: 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69  id = db_column_i
3d80: 6e 74 28 26 71 2c 20 35 29 3b 0a 20 20 20 20 69  nt(&q, 5);.    i
3d90: 6e 74 20 6d 69 64 20 3d 20 64 62 5f 63 6f 6c 75  nt mid = db_colu
3da0: 6d 6e 5f 69 6e 74 28 26 71 2c 20 36 29 3b 0a 20  mn_int(&q, 6);. 
3db0: 20 20 20 69 6e 74 20 66 6e 69 64 20 3d 20 64 62     int fnid = db
3dc0: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20  _column_int(&q, 
3dd0: 37 29 3b 0a 20 20 20 20 63 68 61 72 20 7a 53 68  7);.    char zSh
3de0: 6f 72 74 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28  ort[20];.    if(
3df0: 20 6d 65 6d 63 6d 70 28 7a 44 61 74 65 2c 20 7a   memcmp(zDate, z
3e00: 50 72 65 76 44 61 74 65 2c 20 31 30 29 20 29 7b  PrevDate, 10) ){
3e10: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a  .      sprintf(z
3e20: 50 72 65 76 44 61 74 65 2c 20 22 25 2e 31 30 73  PrevDate, "%.10s
3e30: 22 2c 20 7a 44 61 74 65 29 3b 0a 20 20 20 20 20  ", zDate);.     
3e40: 20 40 20 3c 74 72 3e 3c 74 64 20 63 6f 6c 73 70   @ <tr><td colsp
3e50: 61 6e 3d 33 3e 0a 20 20 20 20 20 20 40 20 20 20  an=3>.      @   
3e60: 3c 64 69 76 20 63 6c 61 73 73 3d 22 64 69 76 69  <div class="divi
3e70: 64 65 72 22 3e 25 73 28 7a 50 72 65 76 44 61 74  der">%s(zPrevDat
3e80: 65 29 3c 2f 64 69 76 3e 0a 20 20 20 20 20 20 40  e)</div>.      @
3e90: 20 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 20 20   </td></tr>.    
3ea0: 7d 0a 20 20 20 20 40 20 3c 74 72 3e 3c 74 64 20  }.    @ <tr><td 
3eb0: 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 25 73 28  valign="top">%s(
3ec0: 26 7a 44 61 74 65 5b 31 31 5d 29 3c 2f 74 64 3e  &zDate[11])</td>
3ed0: 0a 20 20 20 20 40 20 3c 74 64 20 77 69 64 74 68  .    @ <td width
3ee0: 3d 22 32 30 22 3e 3c 2f 74 64 3e 0a 20 20 20 20  ="20"></td>.    
3ef0: 40 20 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74 6f  @ <td valign="to
3f00: 70 22 20 61 6c 69 67 6e 3d 22 6c 65 66 74 22 3e  p" align="left">
3f10: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
3f20: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 53 68  rintf(sizeof(zSh
3f30: 6f 72 74 29 2c 20 7a 53 68 6f 72 74 2c 20 22 25  ort), zShort, "%
3f40: 2e 31 30 73 22 2c 20 7a 55 75 69 64 29 3b 0a 20  .10s", zUuid);. 
3f50: 20 20 20 69 66 28 20 67 2e 6f 6b 48 69 73 74 6f     if( g.okHisto
3f60: 72 79 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 61  ry ){.      @ <a
3f70: 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 54 6f 70   href="%s(g.zTop
3f80: 29 2f 61 72 74 69 66 61 63 74 2f 25 73 28 7a 55  )/artifact/%s(zU
3f90: 75 69 64 29 22 3e 5b 25 73 28 7a 53 68 6f 72 74  uid)">[%s(zShort
3fa0: 29 5d 3c 2f 61 3e 0a 20 20 20 20 7d 65 6c 73 65  )]</a>.    }else
3fb0: 7b 0a 20 20 20 20 20 20 40 20 5b 25 73 28 7a 53  {.      @ [%s(zS
3fc0: 68 6f 72 74 29 5d 0a 20 20 20 20 7d 0a 20 20 20  hort)].    }.   
3fd0: 20 40 20 25 68 28 7a 43 6f 6d 29 20 28 42 79 3a   @ %h(zCom) (By:
3fe0: 20 25 68 28 7a 55 73 65 72 29 29 0a 20 20 20 20   %h(zUser)).    
3ff0: 69 66 28 20 67 2e 6f 6b 48 69 73 74 6f 72 79 20  if( g.okHistory 
4000: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66 70 69  ){.      if( fpi
4010: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 40 20 3c  d ){.        @ <
4020: 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61  a href="%s(g.zBa
4030: 73 65 55 52 4c 29 2f 66 64 69 66 66 3f 76 31 3d  seURL)/fdiff?v1=
4040: 25 64 28 66 70 69 64 29 26 61 6d 70 3b 76 32 3d  %d(fpid)&amp;v2=
4050: 25 64 28 66 72 69 64 29 22 3e 5b 64 69 66 66 5d  %d(frid)">[diff]
4060: 3c 2f 61 3e 0a 20 20 20 20 20 20 7d 0a 20 20 20  </a>.      }.   
4070: 20 20 20 40 20 3c 61 20 68 72 65 66 3d 22 25 73     @ <a href="%s
4080: 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 61 6e 6e  (g.zBaseURL)/ann
4090: 6f 74 61 74 65 3f 6d 69 64 3d 25 64 28 6d 69 64  otate?mid=%d(mid
40a0: 29 26 61 6d 70 3b 66 6e 69 64 3d 25 64 28 66 6e  )&amp;fnid=%d(fn
40b0: 69 64 29 22 3e 0a 20 20 20 20 20 20 40 20 5b 61  id)">.      @ [a
40c0: 6e 6e 6f 74 61 74 65 5d 3c 2f 61 3e 0a 20 20 20  nnotate]</a>.   
40d0: 20 20 20 40 20 3c 2f 74 64 3e 0a 20 20 20 20 7d     @ </td>.    }
40e0: 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69  .  }.  db_finali
40f0: 7a 65 28 26 71 29 3b 0a 20 20 40 20 3c 2f 74 61  ze(&q);.  @ </ta
4100: 62 6c 65 3e 0a 20 20 73 74 79 6c 65 5f 66 6f 6f  ble>.  style_foo
4110: 74 65 72 28 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ter();.}.../*.**
4120: 20 57 45 42 50 41 47 45 3a 20 76 64 69 66 66 0a   WEBPAGE: vdiff.
4130: 2a 2a 20 55 52 4c 3a 20 2f 76 64 69 66 66 3f 6e  ** URL: /vdiff?n
4140: 61 6d 65 3d 52 49 44 0a 2a 2a 0a 2a 2a 20 53 68  ame=RID.**.** Sh
4150: 6f 77 20 61 6c 6c 20 64 69 66 66 65 72 65 6e 63  ow all differenc
4160: 65 73 20 66 6f 72 20 61 20 70 61 72 74 69 63 75  es for a particu
4170: 6c 61 72 20 63 68 65 63 6b 2d 69 6e 2e 0a 2a 2f  lar check-in..*/
4180: 0a 76 6f 69 64 20 76 64 69 66 66 5f 70 61 67 65  .void vdiff_page
4190: 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 72 69  (void){.  int ri
41a0: 64 3b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 63  d;.  Stmt q;.  c
41b0: 68 61 72 20 2a 7a 55 75 69 64 3b 0a 0a 20 20 6c  har *zUuid;..  l
41c0: 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65  ogin_check_crede
41d0: 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28 20  ntials();.  if( 
41e0: 21 67 2e 6f 6b 52 65 61 64 20 29 7b 20 6c 6f 67  !g.okRead ){ log
41f0: 69 6e 5f 6e 65 65 64 65 64 28 29 3b 20 72 65 74  in_needed(); ret
4200: 75 72 6e 3b 20 7d 0a 20 20 6c 6f 67 69 6e 5f 61  urn; }.  login_a
4210: 6e 6f 6e 79 6d 6f 75 73 5f 61 76 61 69 6c 61 62  nonymous_availab
4220: 6c 65 28 29 3b 0a 0a 20 20 72 69 64 20 3d 20 6e  le();..  rid = n
4230: 61 6d 65 5f 74 6f 5f 72 69 64 28 50 44 28 22 6e  ame_to_rid(PD("n
4240: 61 6d 65 22 2c 22 22 29 29 3b 0a 20 20 69 66 28  ame",""));.  if(
4250: 20 72 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 66   rid==0 ){.    f
4260: 6f 73 73 69 6c 5f 72 65 64 69 72 65 63 74 5f 68  ossil_redirect_h
4270: 6f 6d 65 28 29 3b 0a 20 20 7d 0a 20 20 7a 55 75  ome();.  }.  zUu
4280: 69 64 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20  id = db_text(0, 
4290: 22 53 45 4c 45 43 54 20 75 75 69 64 20 46 52 4f  "SELECT uuid FRO
42a0: 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69 64  M blob WHERE rid
42b0: 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 73 74  =%d", rid);.  st
42c0: 79 6c 65 5f 68 65 61 64 65 72 28 22 43 68 65 63  yle_header("Chec
42d0: 6b 2d 69 6e 20 5b 25 2e 31 30 73 5d 22 2c 20 7a  k-in [%.10s]", z
42e0: 55 75 69 64 29 3b 0a 20 20 64 62 5f 70 72 65 70  Uuid);.  db_prep
42f0: 61 72 65 28 26 71 2c 0a 20 20 20 20 22 53 45 4c  are(&q,.    "SEL
4300: 45 43 54 20 64 61 74 65 74 69 6d 65 28 6d 74 69  ECT datetime(mti
4310: 6d 65 29 2c 20 22 0a 20 20 20 20 22 20 20 20 20  me), ".    "    
4320: 20 20 20 63 6f 61 6c 65 73 63 65 28 65 76 65 6e     coalesce(even
4330: 74 2e 65 63 6f 6d 6d 65 6e 74 2c 65 76 65 6e 74  t.ecomment,event
4340: 2e 63 6f 6d 6d 65 6e 74 29 2c 22 0a 20 20 20 20  .comment),".    
4350: 22 20 20 20 20 20 20 20 63 6f 61 6c 65 73 63 65  "       coalesce
4360: 28 65 76 65 6e 74 2e 65 75 73 65 72 2c 65 76 65  (event.euser,eve
4370: 6e 74 2e 75 73 65 72 29 22 0a 20 20 20 20 22 20  nt.user)".    " 
4380: 20 46 52 4f 4d 20 65 76 65 6e 74 20 57 48 45 52   FROM event WHER
4390: 45 20 74 79 70 65 3d 27 63 69 27 20 41 4e 44 20  E type='ci' AND 
43a0: 6f 62 6a 69 64 3d 25 64 22 2c 0a 20 20 20 20 72  objid=%d",.    r
43b0: 69 64 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28  id.  );.  while(
43c0: 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51   db_step(&q)==SQ
43d0: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
43e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
43f0: 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65  e = db_column_te
4400: 78 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 63  xt(&q, 0);.    c
4410: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 65 72  onst char *zUser
4420: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78   = db_column_tex
4430: 74 28 26 71 2c 20 32 29 3b 0a 20 20 20 20 63 6f  t(&q, 2);.    co
4440: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 65  nst char *zComme
4450: 6e 74 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  nt = db_column_t
4460: 65 78 74 28 26 71 2c 20 31 29 3b 0a 20 20 20 20  ext(&q, 1);.    
4470: 40 20 3c 68 32 3e 43 68 65 63 6b 2d 69 6e 20 25  @ <h2>Check-in %
4480: 73 28 7a 55 75 69 64 29 3c 2f 68 32 3e 0a 20 20  s(zUuid)</h2>.  
4490: 20 20 40 20 3c 70 3e 4d 61 64 65 20 62 79 0a 20    @ <p>Made by. 
44a0: 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f     hyperlink_to_
44b0: 75 73 65 72 28 7a 55 73 65 72 2c 7a 44 61 74 65  user(zUser,zDate
44c0: 2c 22 20 6f 6e 22 29 3b 0a 20 20 20 20 68 79 70  ," on");.    hyp
44d0: 65 72 6c 69 6e 6b 5f 74 6f 5f 64 61 74 65 28 7a  erlink_to_date(z
44e0: 44 61 74 65 2c 20 22 3a 22 29 3b 0a 20 20 20 20  Date, ":");.    
44f0: 40 20 25 77 28 7a 43 6f 6d 6d 65 6e 74 29 2e 20  @ %w(zComment). 
4500: 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42  <a href="%s(g.zB
4510: 61 73 65 55 52 4c 29 2f 63 69 2f 25 73 28 7a 55  aseURL)/ci/%s(zU
4520: 75 69 64 29 22 3e 5b 64 65 74 61 69 6c 73 5d 3c  uid)">[details]<
4530: 2f 61 3e 3c 2f 70 3e 0a 20 20 20 20 40 20 3c 68  /a></p>.    @ <h
4540: 72 3e 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61  r>.  }.  db_fina
4550: 6c 69 7a 65 28 26 71 29 3b 0a 20 20 64 62 5f 70  lize(&q);.  db_p
4560: 72 65 70 61 72 65 28 26 71 2c 0a 20 20 20 20 20  repare(&q,.     
4570: 22 53 45 4c 45 43 54 20 70 69 64 2c 20 66 69 64  "SELECT pid, fid
4580: 2c 20 6e 61 6d 65 22 0a 20 20 20 20 20 22 20 20  , name".     "  
4590: 46 52 4f 4d 20 6d 6c 69 6e 6b 2c 20 66 69 6c 65  FROM mlink, file
45a0: 6e 61 6d 65 22 0a 20 20 20 20 20 22 20 57 48 45  name".     " WHE
45b0: 52 45 20 6d 6c 69 6e 6b 2e 6d 69 64 3d 25 64 22  RE mlink.mid=%d"
45c0: 0a 20 20 20 20 20 22 20 20 20 41 4e 44 20 66 69  .     "   AND fi
45d0: 6c 65 6e 61 6d 65 2e 66 6e 69 64 3d 6d 6c 69 6e  lename.fnid=mlin
45e0: 6b 2e 66 6e 69 64 22 0a 20 20 20 20 20 22 20 4f  k.fnid".     " O
45f0: 52 44 45 52 20 42 59 20 6e 61 6d 65 22 2c 0a 20  RDER BY name",. 
4600: 20 20 20 20 72 69 64 0a 20 20 29 3b 0a 20 20 77      rid.  );.  w
4610: 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71  hile( db_step(&q
4620: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
4630: 0a 20 20 20 20 69 6e 74 20 70 69 64 20 3d 20 64  .    int pid = d
4640: 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c  b_column_int(&q,
4650: 30 29 3b 0a 20 20 20 20 69 6e 74 20 66 69 64 20  0);.    int fid 
4660: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  = db_column_int(
4670: 26 71 2c 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74  &q,1);.    const
4680: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 64   char *zName = d
4690: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
46a0: 2c 32 29 3b 0a 20 20 20 20 40 20 3c 70 3e 3c 61  ,2);.    @ <p><a
46b0: 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73   href="%s(g.zBas
46c0: 65 55 52 4c 29 2f 66 69 6e 66 6f 3f 6e 61 6d 65  eURL)/finfo?name
46d0: 3d 25 54 28 7a 4e 61 6d 65 29 22 3e 25 68 28 7a  =%T(zName)">%h(z
46e0: 4e 61 6d 65 29 3c 2f 61 3e 3c 2f 70 3e 0a 20 20  Name)</a></p>.  
46f0: 20 20 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e    @ <blockquote>
4700: 3c 70 72 65 3e 0a 20 20 20 20 61 70 70 65 6e 64  <pre>.    append
4710: 5f 64 69 66 66 28 70 69 64 2c 20 66 69 64 29 3b  _diff(pid, fid);
4720: 0a 20 20 20 20 40 20 3c 2f 70 72 65 3e 3c 2f 62  .    @ </pre></b
4730: 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 7d 0a 20  lockquote>.  }. 
4740: 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29   db_finalize(&q)
4750: 3b 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72  ;.  style_footer
4760: 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  ();.}../*.** Wri
4770: 74 65 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  te a description
4780: 20 6f 66 20 61 6e 20 6f 62 6a 65 63 74 20 74 6f   of an object to
4790: 20 74 68 65 20 77 77 77 20 72 65 70 6c 79 2e 0a   the www reply..
47a0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 62 6a  **.** If the obj
47b0: 65 63 74 20 69 73 20 61 20 66 69 6c 65 20 74 68  ect is a file th
47c0: 65 6e 20 6d 65 6e 74 69 6f 6e 3a 0a 2a 2a 0a 2a  en mention:.**.*
47d0: 2a 20 20 20 20 20 2a 20 49 74 27 73 20 61 72 74  *     * It's art
47e0: 69 66 61 63 74 20 49 44 0a 2a 2a 20 20 20 20 20  ifact ID.**     
47f0: 2a 20 41 6c 6c 20 69 74 73 20 66 69 6c 65 6e 61  * All its filena
4800: 6d 65 73 0a 2a 2a 20 20 20 20 20 2a 20 54 68 65  mes.**     * The
4810: 20 63 68 65 63 6b 2d 69 6e 20 69 74 20 77 61 73   check-in it was
4820: 20 70 61 72 74 20 6f 66 2c 20 77 69 74 68 20 74   part of, with t
4830: 69 6d 65 73 20 61 6e 64 20 75 73 65 72 73 0a 2a  imes and users.*
4840: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 62 6a 65  *.** If the obje
4850: 63 74 20 69 73 20 61 20 6d 61 6e 69 66 65 73 74  ct is a manifest
4860: 2c 20 74 68 65 6e 20 6d 65 6e 74 69 6f 6e 3a 0a  , then mention:.
4870: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 49 74 27 73  **.**     * It's
4880: 20 61 72 74 69 66 61 63 74 20 49 44 0a 2a 2a 20   artifact ID.** 
4890: 20 20 20 20 2a 20 64 61 74 65 20 6f 66 20 63 68      * date of ch
48a0: 65 63 6b 2d 69 6e 0a 2a 2a 20 20 20 20 20 2a 20  eck-in.**     * 
48b0: 43 6f 6d 6d 65 6e 74 20 26 20 75 73 65 72 0a 2a  Comment & user.*
48c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 62  /.static void ob
48d0: 6a 65 63 74 5f 64 65 73 63 72 69 70 74 69 6f 6e  ject_description
48e0: 28 0a 20 20 69 6e 74 20 72 69 64 2c 20 20 20 20  (.  int rid,    
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4900: 54 68 65 20 61 72 74 69 66 61 63 74 20 49 44 20  The artifact ID 
4910: 2a 2f 0a 20 20 69 6e 74 20 6c 69 6e 6b 54 6f 56  */.  int linkToV
4920: 69 65 77 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  iew,          /*
4930: 20 41 64 64 20 76 69 65 77 65 72 20 6c 69 6e 6b   Add viewer link
4940: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 42 6c   if true */.  Bl
4950: 6f 62 20 2a 70 44 6f 77 6e 6c 6f 61 64 4e 61 6d  ob *pDownloadNam
4960: 65 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 77  e      /* Fill w
4970: 69 74 68 20 61 6e 20 61 70 70 72 6f 70 72 69 61  ith an appropria
4980: 74 65 20 64 6f 77 6e 6c 6f 61 64 20 6e 61 6d 65  te download name
4990: 20 2a 2f 0a 29 7b 0a 20 20 53 74 6d 74 20 71 3b   */.){.  Stmt q;
49a0: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
49b0: 20 20 69 6e 74 20 6e 57 69 6b 69 20 3d 20 30 3b    int nWiki = 0;
49c0: 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71  .  db_prepare(&q
49d0: 2c 0a 20 20 20 20 22 53 45 4c 45 43 54 20 66 69  ,.    "SELECT fi
49e0: 6c 65 6e 61 6d 65 2e 6e 61 6d 65 2c 20 64 61 74  lename.name, dat
49f0: 65 74 69 6d 65 28 65 76 65 6e 74 2e 6d 74 69 6d  etime(event.mtim
4a00: 65 29 2c 20 73 75 62 73 74 72 28 61 2e 75 75 69  e), substr(a.uui
4a10: 64 2c 31 2c 31 30 29 2c 22 0a 20 20 20 20 22 20  d,1,10),".    " 
4a20: 20 20 20 20 20 20 63 6f 61 6c 65 73 63 65 28 65        coalesce(e
4a30: 76 65 6e 74 2e 65 63 6f 6d 6d 65 6e 74 2c 65 76  vent.ecomment,ev
4a40: 65 6e 74 2e 63 6f 6d 6d 65 6e 74 29 2c 22 0a 20  ent.comment),". 
4a50: 20 20 20 22 20 20 20 20 20 20 20 63 6f 61 6c 65     "       coale
4a60: 73 63 65 28 65 76 65 6e 74 2e 65 75 73 65 72 2c  sce(event.euser,
4a70: 65 76 65 6e 74 2e 75 73 65 72 29 2c 22 0a 20 20  event.user),".  
4a80: 20 20 22 20 20 20 20 20 20 20 62 2e 75 75 69 64    "       b.uuid
4a90: 22 0a 20 20 20 20 22 20 20 46 52 4f 4d 20 6d 6c  ".    "  FROM ml
4aa0: 69 6e 6b 2c 20 66 69 6c 65 6e 61 6d 65 2c 20 65  ink, filename, e
4ab0: 76 65 6e 74 2c 20 62 6c 6f 62 20 61 2c 20 62 6c  vent, blob a, bl
4ac0: 6f 62 20 62 22 0a 20 20 20 20 22 20 57 48 45 52  ob b".    " WHER
4ad0: 45 20 66 69 6c 65 6e 61 6d 65 2e 66 6e 69 64 3d  E filename.fnid=
4ae0: 6d 6c 69 6e 6b 2e 66 6e 69 64 22 0a 20 20 20 20  mlink.fnid".    
4af0: 22 20 20 20 41 4e 44 20 65 76 65 6e 74 2e 6f 62  "   AND event.ob
4b00: 6a 69 64 3d 6d 6c 69 6e 6b 2e 6d 69 64 22 0a 20  jid=mlink.mid". 
4b10: 20 20 20 22 20 20 20 41 4e 44 20 61 2e 72 69 64     "   AND a.rid
4b20: 3d 6d 6c 69 6e 6b 2e 66 69 64 22 0a 20 20 20 20  =mlink.fid".    
4b30: 22 20 20 20 41 4e 44 20 62 2e 72 69 64 3d 6d 6c  "   AND b.rid=ml
4b40: 69 6e 6b 2e 6d 69 64 22 0a 20 20 20 20 22 20 20  ink.mid".    "  
4b50: 20 41 4e 44 20 6d 6c 69 6e 6b 2e 66 69 64 3d 25   AND mlink.fid=%
4b60: 64 22 2c 0a 20 20 20 20 72 69 64 0a 20 20 29 3b  d",.    rid.  );
4b70: 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65  .  while( db_ste
4b80: 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  p(&q)==SQLITE_RO
4b90: 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  W ){.    const c
4ba0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 64 62 5f  har *zName = db_
4bb0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
4bc0: 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  0);.    const ch
4bd0: 61 72 20 2a 7a 44 61 74 65 20 3d 20 64 62 5f 63  ar *zDate = db_c
4be0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31  olumn_text(&q, 1
4bf0: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
4c00: 72 20 2a 7a 46 75 75 69 64 20 3d 20 64 62 5f 63  r *zFuuid = db_c
4c10: 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 32  olumn_text(&q, 2
4c20: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
4c30: 72 20 2a 7a 43 6f 6d 20 3d 20 64 62 5f 63 6f 6c  r *zCom = db_col
4c40: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 33 29 3b  umn_text(&q, 3);
4c50: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
4c60: 2a 7a 55 73 65 72 20 3d 20 64 62 5f 63 6f 6c 75  *zUser = db_colu
4c70: 6d 6e 5f 74 65 78 74 28 26 71 2c 20 34 29 3b 0a  mn_text(&q, 4);.
4c80: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
4c90: 7a 56 65 72 73 20 3d 20 64 62 5f 63 6f 6c 75 6d  zVers = db_colum
4ca0: 6e 5f 74 65 78 74 28 26 71 2c 20 35 29 3b 0a 20  n_text(&q, 5);. 
4cb0: 20 20 20 69 66 28 20 63 6e 74 3e 30 20 29 7b 0a     if( cnt>0 ){.
4cc0: 20 20 20 20 20 20 40 20 41 6c 73 6f 20 66 69 6c        @ Also fil
4cd0: 65 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e.    }else{.   
4ce0: 20 20 20 40 20 46 69 6c 65 0a 20 20 20 20 7d 0a     @ File.    }.
4cf0: 20 20 20 20 40 20 3c 61 20 68 72 65 66 3d 22 25      @ <a href="%
4d00: 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 66 69  s(g.zBaseURL)/fi
4d10: 6e 66 6f 3f 6e 61 6d 65 3d 25 54 28 7a 4e 61 6d  nfo?name=%T(zNam
4d20: 65 29 22 3e 25 68 28 7a 4e 61 6d 65 29 3c 2f 61  e)">%h(zName)</a
4d30: 3e 0a 20 20 20 20 40 20 61 72 74 69 66 61 63 74  >.    @ artifact
4d40: 20 25 73 28 7a 46 75 75 69 64 29 20 70 61 72 74   %s(zFuuid) part
4d50: 20 6f 66 20 63 68 65 63 6b 2d 69 6e 0a 20 20 20   of check-in.   
4d60: 20 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 75   hyperlink_to_uu
4d70: 69 64 28 7a 56 65 72 73 29 3b 0a 20 20 20 20 40  id(zVers);.    @
4d80: 20 2d 20 25 77 28 7a 43 6f 6d 29 20 62 79 20 0a   - %w(zCom) by .
4d90: 20 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f 74 6f      hyperlink_to
4da0: 5f 75 73 65 72 28 7a 55 73 65 72 2c 7a 44 61 74  _user(zUser,zDat
4db0: 65 2c 22 20 6f 6e 22 29 3b 0a 20 20 20 20 68 79  e," on");.    hy
4dc0: 70 65 72 6c 69 6e 6b 5f 74 6f 5f 64 61 74 65 28  perlink_to_date(
4dd0: 7a 44 61 74 65 2c 22 2e 22 29 3b 0a 20 20 20 20  zDate,".");.    
4de0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  cnt++;.    if( p
4df0: 44 6f 77 6e 6c 6f 61 64 4e 61 6d 65 20 26 26 20  DownloadName && 
4e00: 62 6c 6f 62 5f 73 69 7a 65 28 70 44 6f 77 6e 6c  blob_size(pDownl
4e10: 6f 61 64 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  oadName)==0 ){. 
4e20: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
4e30: 28 70 44 6f 77 6e 6c 6f 61 64 4e 61 6d 65 2c 20  (pDownloadName, 
4e40: 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20 20  zName, -1);.    
4e50: 7d 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c  }.  }.  db_final
4e60: 69 7a 65 28 26 71 29 3b 0a 20 20 64 62 5f 70 72  ize(&q);.  db_pr
4e70: 65 70 61 72 65 28 26 71 2c 20 0a 20 20 20 20 22  epare(&q, .    "
4e80: 53 45 4c 45 43 54 20 73 75 62 73 74 72 28 74 61  SELECT substr(ta
4e90: 67 6e 61 6d 65 2c 20 36 2c 20 31 30 30 30 30 29  gname, 6, 10000)
4ea0: 2c 20 64 61 74 65 74 69 6d 65 28 65 76 65 6e 74  , datetime(event
4eb0: 2e 6d 74 69 6d 65 29 2c 22 0a 20 20 20 20 22 20  .mtime),".    " 
4ec0: 20 20 20 20 20 20 63 6f 61 6c 65 73 63 65 28 65        coalesce(e
4ed0: 76 65 6e 74 2e 65 75 73 65 72 2c 20 65 76 65 6e  vent.euser, even
4ee0: 74 2e 75 73 65 72 29 2c 20 75 75 69 64 22 0a 20  t.user), uuid". 
4ef0: 20 20 20 22 20 20 46 52 4f 4d 20 74 61 67 78 72     "  FROM tagxr
4f00: 65 66 2c 20 74 61 67 2c 20 65 76 65 6e 74 2c 20  ef, tag, event, 
4f10: 62 6c 6f 62 22 0a 20 20 20 20 22 20 57 48 45 52  blob".    " WHER
4f20: 45 20 74 61 67 78 72 65 66 2e 72 69 64 3d 25 64  E tagxref.rid=%d
4f30: 22 0a 20 20 20 20 22 20 20 20 41 4e 44 20 74 61  ".    "   AND ta
4f40: 67 2e 74 61 67 69 64 3d 74 61 67 78 72 65 66 2e  g.tagid=tagxref.
4f50: 74 61 67 69 64 22 20 0a 20 20 20 20 22 20 20 20  tagid" .    "   
4f60: 41 4e 44 20 74 61 67 2e 74 61 67 6e 61 6d 65 20  AND tag.tagname 
4f70: 4c 49 4b 45 20 27 77 69 6b 69 2d 25 25 27 22 0a  LIKE 'wiki-%%'".
4f80: 20 20 20 20 22 20 20 20 41 4e 44 20 65 76 65 6e      "   AND even
4f90: 74 2e 6f 62 6a 69 64 3d 74 61 67 78 72 65 66 2e  t.objid=tagxref.
4fa0: 72 69 64 22 0a 20 20 20 20 22 20 20 20 41 4e 44  rid".    "   AND
4fb0: 20 62 6c 6f 62 2e 72 69 64 3d 74 61 67 78 72 65   blob.rid=tagxre
4fc0: 66 2e 72 69 64 22 2c 0a 20 20 20 20 72 69 64 0a  f.rid",.    rid.
4fd0: 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 64 62    );.  while( db
4fe0: 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54  _step(&q)==SQLIT
4ff0: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e  E_ROW ){.    con
5000: 73 74 20 63 68 61 72 20 2a 7a 50 61 67 65 6e 61  st char *zPagena
5010: 6d 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  me = db_column_t
5020: 65 78 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20  ext(&q, 0);.    
5030: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
5040: 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65  e = db_column_te
5050: 78 74 28 26 71 2c 20 31 29 3b 0a 20 20 20 20 63  xt(&q, 1);.    c
5060: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 65 72  onst char *zUser
5070: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78   = db_column_tex
5080: 74 28 26 71 2c 20 32 29 3b 0a 20 20 20 20 63 6f  t(&q, 2);.    co
5090: 6e 73 74 20 63 68 61 72 20 2a 7a 55 75 69 64 20  nst char *zUuid 
50a0: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
50b0: 28 26 71 2c 20 33 29 3b 0a 20 20 20 20 69 66 28  (&q, 3);.    if(
50c0: 20 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20 20 20   cnt>0 ){.      
50d0: 40 20 41 6c 73 6f 20 77 69 6b 69 20 70 61 67 65  @ Also wiki page
50e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
50f0: 20 20 40 20 57 69 6b 69 20 70 61 67 65 0a 20 20    @ Wiki page.  
5100: 20 20 7d 0a 20 20 20 20 40 20 5b 3c 61 20 68 72    }.    @ [<a hr
5110: 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52  ef="%s(g.zBaseUR
5120: 4c 29 2f 77 69 6b 69 3f 6e 61 6d 65 3d 25 74 28  L)/wiki?name=%t(
5130: 7a 50 61 67 65 6e 61 6d 65 29 22 3e 25 68 28 7a  zPagename)">%h(z
5140: 50 61 67 65 6e 61 6d 65 29 3c 2f 61 3e 5d 0a 20  Pagename)</a>]. 
5150: 20 20 20 40 20 61 72 74 69 66 61 63 74 20 25 73     @ artifact %s
5160: 28 7a 55 75 69 64 29 20 62 79 0a 20 20 20 20 68  (zUuid) by.    h
5170: 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 73 65 72  yperlink_to_user
5180: 28 7a 55 73 65 72 2c 7a 44 61 74 65 2c 22 20 6f  (zUser,zDate," o
5190: 6e 22 29 3b 0a 20 20 20 20 68 79 70 65 72 6c 69  n");.    hyperli
51a0: 6e 6b 5f 74 6f 5f 64 61 74 65 28 7a 44 61 74 65  nk_to_date(zDate
51b0: 2c 22 2e 22 29 3b 0a 20 20 20 20 6e 57 69 6b 69  ,".");.    nWiki
51c0: 2b 2b 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  ++;.    cnt++;. 
51d0: 20 20 20 69 66 28 20 70 44 6f 77 6e 6c 6f 61 64     if( pDownload
51e0: 4e 61 6d 65 20 26 26 20 62 6c 6f 62 5f 73 69 7a  Name && blob_siz
51f0: 65 28 70 44 6f 77 6e 6c 6f 61 64 4e 61 6d 65 29  e(pDownloadName)
5200: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f  ==0 ){.      blo
5210: 62 5f 61 70 70 65 6e 64 28 70 44 6f 77 6e 6c 6f  b_append(pDownlo
5220: 61 64 4e 61 6d 65 2c 20 7a 50 61 67 65 6e 61 6d  adName, zPagenam
5230: 65 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20  e, -1);.    }.  
5240: 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28  }.  db_finalize(
5250: 26 71 29 3b 0a 20 20 69 66 28 20 6e 57 69 6b 69  &q);.  if( nWiki
5260: 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 5f 70 72  ==0 ){.    db_pr
5270: 65 70 61 72 65 28 26 71 2c 0a 20 20 20 20 20 20  epare(&q,.      
5280: 22 53 45 4c 45 43 54 20 64 61 74 65 74 69 6d 65  "SELECT datetime
5290: 28 6d 74 69 6d 65 29 2c 20 75 73 65 72 2c 20 63  (mtime), user, c
52a0: 6f 6d 6d 65 6e 74 2c 20 75 75 69 64 2c 20 74 79  omment, uuid, ty
52b0: 70 65 22 0a 20 20 20 20 20 20 22 20 20 46 52 4f  pe".      "  FRO
52c0: 4d 20 65 76 65 6e 74 2c 20 62 6c 6f 62 22 0a 20  M event, blob". 
52d0: 20 20 20 20 20 22 20 57 48 45 52 45 20 65 76 65       " WHERE eve
52e0: 6e 74 2e 6f 62 6a 69 64 3d 25 64 22 0a 20 20 20  nt.objid=%d".   
52f0: 20 20 20 22 20 20 20 41 4e 44 20 62 6c 6f 62 2e     "   AND blob.
5300: 72 69 64 3d 25 64 22 2c 0a 20 20 20 20 20 20 72  rid=%d",.      r
5310: 69 64 2c 20 72 69 64 0a 20 20 20 20 29 3b 0a 20  id, rid.    );. 
5320: 20 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65     while( db_ste
5330: 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  p(&q)==SQLITE_RO
5340: 57 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  W ){.      const
5350: 20 63 68 61 72 20 2a 7a 44 61 74 65 20 3d 20 64   char *zDate = d
5360: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
5370: 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  , 0);.      cons
5380: 74 20 63 68 61 72 20 2a 7a 55 75 69 64 20 3d 20  t char *zUuid = 
5390: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
53a0: 71 2c 20 33 29 3b 0a 20 20 20 20 20 20 63 6f 6e  q, 3);.      con
53b0: 73 74 20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d  st char *zUser =
53c0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28   db_column_text(
53d0: 26 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 63 6f  &q, 1);.      co
53e0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 20 3d  nst char *zCom =
53f0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28   db_column_text(
5400: 26 71 2c 20 32 29 3b 0a 20 20 20 20 20 20 63 6f  &q, 2);.      co
5410: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
5420: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
5430: 28 26 71 2c 20 34 29 3b 0a 20 20 20 20 20 20 69  (&q, 4);.      i
5440: 66 28 20 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20  f( cnt>0 ){.    
5450: 20 20 20 20 40 20 41 6c 73 6f 0a 20 20 20 20 20      @ Also.     
5460: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 54 79   }.      if( zTy
5470: 70 65 5b 30 5d 3d 3d 27 77 27 20 29 7b 0a 20 20  pe[0]=='w' ){.  
5480: 20 20 20 20 20 20 40 20 57 69 6b 69 20 65 64 69        @ Wiki edi
5490: 74 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  t.      }else if
54a0: 28 20 7a 54 79 70 65 5b 30 5d 3d 3d 27 74 27 20  ( zType[0]=='t' 
54b0: 29 7b 0a 20 20 20 20 20 20 20 20 40 20 54 69 63  ){.        @ Tic
54c0: 6b 65 74 20 63 68 61 6e 67 65 0a 20 20 20 20 20  ket change.     
54d0: 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 79 70 65   }else if( zType
54e0: 5b 30 5d 3d 3d 27 63 27 20 29 7b 0a 20 20 20 20  [0]=='c' ){.    
54f0: 20 20 20 20 40 20 4d 61 6e 69 66 65 73 74 20 6f      @ Manifest o
5500: 66 20 63 68 65 63 6b 2d 69 6e 0a 20 20 20 20 20  f check-in.     
5510: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5520: 40 20 43 6f 6e 74 72 6f 6c 20 66 69 6c 65 20 72  @ Control file r
5530: 65 66 65 72 65 6e 63 69 6e 67 0a 20 20 20 20 20  eferencing.     
5540: 20 7d 0a 20 20 20 20 20 20 68 79 70 65 72 6c 69   }.      hyperli
5550: 6e 6b 5f 74 6f 5f 75 75 69 64 28 7a 55 75 69 64  nk_to_uuid(zUuid
5560: 29 3b 0a 20 20 20 20 20 20 40 20 2d 20 25 77 28  );.      @ - %w(
5570: 7a 43 6f 6d 29 20 62 79 0a 20 20 20 20 20 20 68  zCom) by.      h
5580: 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 73 65 72  yperlink_to_user
5590: 28 7a 55 73 65 72 2c 7a 44 61 74 65 2c 22 20 6f  (zUser,zDate," o
55a0: 6e 22 29 3b 0a 20 20 20 20 20 20 68 79 70 65 72  n");.      hyper
55b0: 6c 69 6e 6b 5f 74 6f 5f 64 61 74 65 28 7a 44 61  link_to_date(zDa
55c0: 74 65 2c 20 22 2e 22 29 3b 0a 20 20 20 20 20 20  te, ".");.      
55d0: 69 66 28 20 70 44 6f 77 6e 6c 6f 61 64 4e 61 6d  if( pDownloadNam
55e0: 65 20 26 26 20 62 6c 6f 62 5f 73 69 7a 65 28 70  e && blob_size(p
55f0: 44 6f 77 6e 6c 6f 61 64 4e 61 6d 65 29 3d 3d 30  DownloadName)==0
5600: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62   ){.        blob
5610: 5f 61 70 70 65 6e 64 28 70 44 6f 77 6e 6c 6f 61  _append(pDownloa
5620: 64 4e 61 6d 65 2c 20 7a 55 75 69 64 2c 20 2d 31  dName, zUuid, -1
5630: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5640: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   cnt++;.    }.  
5650: 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71    db_finalize(&q
5660: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6e 74  );.  }.  if( cnt
5670: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
5680: 2a 7a 55 75 69 64 20 3d 20 64 62 5f 74 65 78 74  *zUuid = db_text
5690: 28 30 2c 20 22 53 45 4c 45 43 54 20 75 75 69 64  (0, "SELECT uuid
56a0: 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45   FROM blob WHERE
56b0: 20 72 69 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a   rid=%d", rid);.
56c0: 20 20 20 20 40 20 43 6f 6e 74 72 6f 6c 20 66 69      @ Control fi
56d0: 6c 65 20 25 73 28 7a 55 75 69 64 29 2e 0a 20 20  le %s(zUuid)..  
56e0: 20 20 69 66 28 20 70 44 6f 77 6e 6c 6f 61 64 4e    if( pDownloadN
56f0: 61 6d 65 20 26 26 20 62 6c 6f 62 5f 73 69 7a 65  ame && blob_size
5700: 28 70 44 6f 77 6e 6c 6f 61 64 4e 61 6d 65 29 3d  (pDownloadName)=
5710: 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62  =0 ){.      blob
5720: 5f 61 70 70 65 6e 64 28 70 44 6f 77 6e 6c 6f 61  _append(pDownloa
5730: 64 4e 61 6d 65 2c 20 7a 55 75 69 64 2c 20 2d 31  dName, zUuid, -1
5740: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
5750: 20 69 66 28 20 6c 69 6e 6b 54 6f 56 69 65 77 20   if( linkToView 
5760: 29 7b 0a 20 20 20 20 40 20 3c 61 20 68 72 65 66  ){.    @ <a href
5770: 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29  ="%s(g.zBaseURL)
5780: 2f 61 72 74 69 66 61 63 74 2f 25 64 28 72 69 64  /artifact/%d(rid
5790: 29 22 3e 5b 76 69 65 77 5d 3c 2f 61 3e 0a 20 20  )">[view]</a>.  
57a0: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50  }.}.../*.** WEBP
57b0: 41 47 45 3a 20 66 64 69 66 66 0a 2a 2a 0a 2a 2a  AGE: fdiff.**.**
57c0: 20 54 77 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20   Two arguments, 
57d0: 76 31 20 61 6e 64 20 76 32 2c 20 61 72 65 20 69  v1 and v2, are i
57e0: 6e 74 65 67 65 72 73 2e 20 20 53 68 6f 77 20 74  ntegers.  Show t
57f0: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
5800: 74 77 65 65 6e 0a 2a 2a 20 74 68 65 20 74 77 6f  tween.** the two
5810: 20 72 65 63 6f 72 64 73 2e 0a 2a 2f 0a 76 6f 69   records..*/.voi
5820: 64 20 64 69 66 66 5f 70 61 67 65 28 76 6f 69 64  d diff_page(void
5830: 29 7b 0a 20 20 69 6e 74 20 76 31 20 3d 20 6e 61  ){.  int v1 = na
5840: 6d 65 5f 74 6f 5f 72 69 64 28 50 44 28 22 76 31  me_to_rid(PD("v1
5850: 22 2c 22 30 22 29 29 3b 0a 20 20 69 6e 74 20 76  ","0"));.  int v
5860: 32 20 3d 20 6e 61 6d 65 5f 74 6f 5f 72 69 64 28  2 = name_to_rid(
5870: 50 44 28 22 76 32 22 2c 22 30 22 29 29 3b 0a 20  PD("v2","0"));. 
5880: 20 42 6c 6f 62 20 63 31 2c 20 63 32 2c 20 64 69   Blob c1, c2, di
5890: 66 66 3b 0a 0a 20 20 6c 6f 67 69 6e 5f 63 68 65  ff;..  login_che
58a0: 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29  ck_credentials()
58b0: 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b 52 65 61  ;.  if( !g.okRea
58c0: 64 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64 65  d ){ login_neede
58d0: 64 28 29 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20  d(); return; }. 
58e0: 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22 44   style_header("D
58f0: 69 66 66 22 29 3b 0a 20 20 40 20 3c 68 32 3e 44  iff");.  @ <h2>D
5900: 69 66 66 65 72 65 6e 63 65 73 20 46 72 6f 6d 3a  ifferences From:
5910: 3c 2f 68 32 3e 0a 20 20 40 20 3c 62 6c 6f 63 6b  </h2>.  @ <block
5920: 71 75 6f 74 65 3e 0a 20 20 6f 62 6a 65 63 74 5f  quote>.  object_
5930: 64 65 73 63 72 69 70 74 69 6f 6e 28 76 31 2c 20  description(v1, 
5940: 31 2c 20 30 29 3b 0a 20 20 40 20 3c 2f 62 6c 6f  1, 0);.  @ </blo
5950: 63 6b 71 75 6f 74 65 3e 0a 20 20 40 20 3c 68 32  ckquote>.  @ <h2
5960: 3e 54 6f 3a 3c 2f 68 32 3e 0a 20 20 40 20 3c 62  >To:</h2>.  @ <b
5970: 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 6f 62 6a  lockquote>.  obj
5980: 65 63 74 5f 64 65 73 63 72 69 70 74 69 6f 6e 28  ect_description(
5990: 76 32 2c 20 31 2c 20 30 29 3b 0a 20 20 40 20 3c  v2, 1, 0);.  @ <
59a0: 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 40  /blockquote>.  @
59b0: 20 3c 68 72 3e 0a 20 20 40 20 3c 62 6c 6f 63 6b   <hr>.  @ <block
59c0: 71 75 6f 74 65 3e 3c 70 72 65 3e 0a 20 20 63 6f  quote><pre>.  co
59d0: 6e 74 65 6e 74 5f 67 65 74 28 76 31 2c 20 26 63  ntent_get(v1, &c
59e0: 31 29 3b 0a 20 20 63 6f 6e 74 65 6e 74 5f 67 65  1);.  content_ge
59f0: 74 28 76 32 2c 20 26 63 32 29 3b 0a 20 20 62 6c  t(v2, &c2);.  bl
5a00: 6f 62 5f 7a 65 72 6f 28 26 64 69 66 66 29 3b 0a  ob_zero(&diff);.
5a10: 20 20 74 65 78 74 5f 64 69 66 66 28 26 63 31 2c    text_diff(&c1,
5a20: 20 26 63 32 2c 20 26 64 69 66 66 2c 20 34 29 3b   &c2, &diff, 4);
5a30: 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 63  .  blob_reset(&c
5a40: 31 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74  1);.  blob_reset
5a50: 28 26 63 32 29 3b 0a 20 20 40 20 25 68 28 62 6c  (&c2);.  @ %h(bl
5a60: 6f 62 5f 73 74 72 28 26 64 69 66 66 29 29 0a 20  ob_str(&diff)). 
5a70: 20 40 20 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b   @ </pre></block
5a80: 71 75 6f 74 65 3e 0a 20 20 62 6c 6f 62 5f 72 65  quote>.  blob_re
5a90: 73 65 74 28 26 64 69 66 66 29 3b 0a 20 20 73 74  set(&diff);.  st
5aa0: 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a  yle_footer();.}.
5ab0: 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20  ./*.** WEBPAGE: 
5ac0: 72 61 77 0a 2a 2a 20 55 52 4c 3a 20 2f 72 61 77  raw.** URL: /raw
5ad0: 3f 6e 61 6d 65 3d 41 52 54 49 46 41 43 54 49 44  ?name=ARTIFACTID
5ae0: 26 6d 3d 54 59 50 45 0a 2a 2a 20 0a 2a 2a 20 52  &m=TYPE.** .** R
5af0: 65 74 75 72 6e 20 74 68 65 20 75 6e 69 6e 74 65  eturn the uninte
5b00: 72 70 72 65 74 65 64 20 63 6f 6e 74 65 6e 74 20  rpreted content 
5b10: 6f 66 20 61 6e 20 61 72 74 69 66 61 63 74 2e 20  of an artifact. 
5b20: 20 55 73 65 64 20 70 72 69 6d 61 72 69 6c 79 0a   Used primarily.
5b30: 2a 2a 20 74 6f 20 76 69 65 77 20 61 72 74 69 66  ** to view artif
5b40: 61 63 74 73 20 74 68 61 74 20 61 72 65 20 69 6d  acts that are im
5b50: 61 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 72 61  ages..*/.void ra
5b60: 77 61 72 74 69 66 61 63 74 5f 70 61 67 65 28 76  wartifact_page(v
5b70: 6f 69 64 29 7b 0a 20 20 69 6e 74 20 72 69 64 3b  oid){.  int rid;
5b80: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5b90: 4d 69 6d 65 3b 0a 20 20 42 6c 6f 62 20 63 6f 6e  Mime;.  Blob con
5ba0: 74 65 6e 74 3b 0a 0a 20 20 72 69 64 20 3d 20 6e  tent;..  rid = n
5bb0: 61 6d 65 5f 74 6f 5f 72 69 64 28 50 44 28 22 6e  ame_to_rid(PD("n
5bc0: 61 6d 65 22 2c 22 30 22 29 29 3b 0a 20 20 7a 4d  ame","0"));.  zM
5bd0: 69 6d 65 20 3d 20 50 44 28 22 6d 22 2c 22 61 70  ime = PD("m","ap
5be0: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 66 6f 73 73  plication/x-foss
5bf0: 69 6c 2d 61 72 74 69 66 61 63 74 22 29 3b 0a 20  il-artifact");. 
5c00: 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65   login_check_cre
5c10: 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66  dentials();.  if
5c20: 28 20 21 67 2e 6f 6b 52 65 61 64 20 29 7b 20 6c  ( !g.okRead ){ l
5c30: 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b 20 72  ogin_needed(); r
5c40: 65 74 75 72 6e 3b 20 7d 0a 20 20 69 66 28 20 72  eturn; }.  if( r
5c50: 69 64 3d 3d 30 20 29 7b 20 63 67 69 5f 72 65 64  id==0 ){ cgi_red
5c60: 69 72 65 63 74 28 22 2f 68 6f 6d 65 22 29 3b 20  irect("/home"); 
5c70: 7d 0a 20 20 63 6f 6e 74 65 6e 74 5f 67 65 74 28  }.  content_get(
5c80: 72 69 64 2c 20 26 63 6f 6e 74 65 6e 74 29 3b 0a  rid, &content);.
5c90: 20 20 63 67 69 5f 73 65 74 5f 63 6f 6e 74 65 6e    cgi_set_conten
5ca0: 74 5f 74 79 70 65 28 7a 4d 69 6d 65 29 3b 0a 20  t_type(zMime);. 
5cb0: 20 63 67 69 5f 73 65 74 5f 63 6f 6e 74 65 6e 74   cgi_set_content
5cc0: 28 26 63 6f 6e 74 65 6e 74 29 3b 0a 7d 0a 0a 2f  (&content);.}../
5cd0: 2a 0a 2a 2a 20 52 65 6e 64 65 72 20 61 20 68 65  *.** Render a he
5ce0: 78 20 64 75 6d 70 20 6f 66 20 61 20 66 69 6c 65  x dump of a file
5cf0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5d00: 20 68 65 78 64 75 6d 70 28 42 6c 6f 62 20 2a 70   hexdump(Blob *p
5d10: 42 6c 6f 62 29 7b 0a 20 20 63 6f 6e 73 74 20 75  Blob){.  const u
5d20: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 78 3b  nsigned char *x;
5d30: 0a 20 20 69 6e 74 20 6e 2c 20 69 2c 20 6a 2c 20  .  int n, i, j, 
5d40: 6b 3b 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b  k;.  char zLine[
5d50: 31 30 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63  100];.  static c
5d60: 6f 6e 73 74 20 63 68 61 72 20 7a 48 65 78 5b 5d  onst char zHex[]
5d70: 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 61 62   = "0123456789ab
5d80: 63 64 65 66 22 3b 0a 0a 20 20 78 20 3d 20 28 63  cdef";..  x = (c
5d90: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
5da0: 61 72 2a 29 62 6c 6f 62 5f 62 75 66 66 65 72 28  ar*)blob_buffer(
5db0: 70 42 6c 6f 62 29 3b 0a 20 20 6e 20 3d 20 62 6c  pBlob);.  n = bl
5dc0: 6f 62 5f 73 69 7a 65 28 70 42 6c 6f 62 29 3b 0a  ob_size(pBlob);.
5dd0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
5de0: 69 2b 3d 31 36 29 7b 0a 20 20 20 20 6a 20 3d 20  i+=16){.    j = 
5df0: 30 3b 0a 20 20 20 20 7a 4c 69 6e 65 5b 30 5d 20  0;.    zLine[0] 
5e00: 3d 20 7a 48 65 78 5b 28 69 3e 3e 32 34 29 26 30  = zHex[(i>>24)&0
5e10: 78 66 5d 3b 0a 20 20 20 20 7a 4c 69 6e 65 5b 31  xf];.    zLine[1
5e20: 5d 20 3d 20 7a 48 65 78 5b 28 69 3e 3e 31 36 29  ] = zHex[(i>>16)
5e30: 26 30 78 66 5d 3b 0a 20 20 20 20 7a 4c 69 6e 65  &0xf];.    zLine
5e40: 5b 32 5d 20 3d 20 7a 48 65 78 5b 28 69 3e 3e 38  [2] = zHex[(i>>8
5e50: 29 26 30 78 66 5d 3b 0a 20 20 20 20 7a 4c 69 6e  )&0xf];.    zLin
5e60: 65 5b 33 5d 20 3d 20 7a 48 65 78 5b 69 26 30 78  e[3] = zHex[i&0x
5e70: 66 5d 3b 0a 20 20 20 20 7a 4c 69 6e 65 5b 34 5d  f];.    zLine[4]
5e80: 20 3d 20 27 3a 27 3b 0a 20 20 20 20 73 70 72 69   = ':';.    spri
5e90: 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25 30 34 78  ntf(zLine, "%04x
5ea0: 3a 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 6f 72  : ", i);.    for
5eb0: 28 6a 3d 30 3b 20 6a 3c 31 36 3b 20 6a 2b 2b 29  (j=0; j<16; j++)
5ec0: 7b 0a 20 20 20 20 20 20 6b 20 3d 20 35 2b 6a 2a  {.      k = 5+j*
5ed0: 33 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6b  3;.      zLine[k
5ee0: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 69  ] = ' ';.      i
5ef0: 66 28 20 69 2b 6a 3c 6e 20 29 7b 0a 20 20 20 20  f( i+j<n ){.    
5f00: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
5f10: 72 20 63 20 3d 20 78 5b 69 2b 6a 5d 3b 0a 20 20  r c = x[i+j];.  
5f20: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6b 2b 31 5d        zLine[k+1]
5f30: 20 3d 20 7a 48 65 78 5b 63 3e 3e 34 5d 3b 0a 20   = zHex[c>>4];. 
5f40: 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6b 2b 32         zLine[k+2
5f50: 5d 20 3d 20 7a 48 65 78 5b 63 26 30 78 66 5d 3b  ] = zHex[c&0xf];
5f60: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5f70: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6b 2b 31 5d        zLine[k+1]
5f80: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20   = ' ';.        
5f90: 7a 4c 69 6e 65 5b 6b 2b 32 5d 20 3d 20 27 20 27  zLine[k+2] = ' '
5fa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5fb0: 20 20 20 20 7a 4c 69 6e 65 5b 35 33 5d 20 3d 20      zLine[53] = 
5fc0: 27 20 27 3b 0a 20 20 20 20 7a 4c 69 6e 65 5b 35  ' ';.    zLine[5
5fd0: 34 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 66 6f  4] = ' ';.    fo
5fe0: 72 28 6a 3d 30 3b 20 6a 3c 31 36 3b 20 6a 2b 2b  r(j=0; j<16; j++
5ff0: 29 7b 0a 20 20 20 20 20 20 6b 20 3d 20 6a 2b 35  ){.      k = j+5
6000: 35 3b 0a 20 20 20 20 20 20 69 66 28 20 69 2b 6a  5;.      if( i+j
6010: 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e  <n ){.        un
6020: 73 69 67 6e 65 64 20 63 68 61 72 20 63 20 3d 20  signed char c = 
6030: 78 5b 69 2b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  x[i+j];.        
6040: 69 66 28 20 63 3e 3d 30 78 32 30 20 26 26 20 63  if( c>=0x20 && c
6050: 3c 3d 30 78 37 65 20 29 7b 0a 20 20 20 20 20 20  <=0x7e ){.      
6060: 20 20 20 20 7a 4c 69 6e 65 5b 6b 5d 20 3d 20 63      zLine[k] = c
6070: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
6080: 0a 20 20 20 20 20 20 20 20 20 20 7a 4c 69 6e 65  .          zLine
6090: 5b 6b 5d 20 3d 20 27 2e 27 3b 0a 20 20 20 20 20  [k] = '.';.     
60a0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
60b0: 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b  {.        zLine[
60c0: 6b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  k] = 0;.      }.
60d0: 20 20 20 20 7d 0a 20 20 20 20 7a 4c 69 6e 65 5b      }.    zLine[
60e0: 37 31 5d 20 3d 20 30 3b 0a 20 20 20 20 40 20 25  71] = 0;.    @ %
60f0: 68 28 7a 4c 69 6e 65 29 0a 20 20 7d 0a 7d 0a 0a  h(zLine).  }.}..
6100: 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 68  /*.** WEBPAGE: h
6110: 65 78 64 75 6d 70 0a 2a 2a 20 55 52 4c 3a 20 2f  exdump.** URL: /
6120: 68 65 78 64 75 6d 70 3f 6e 61 6d 65 3d 41 52 54  hexdump?name=ART
6130: 49 46 41 43 54 49 44 0a 2a 2a 20 0a 2a 2a 20 53  IFACTID.** .** S
6140: 68 6f 77 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  how the complete
6150: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 66 69   content of a fi
6160: 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  le identified by
6170: 20 41 52 54 49 46 41 43 54 49 44 0a 2a 2a 20 61   ARTIFACTID.** a
6180: 73 20 70 72 65 66 6f 72 6d 61 74 74 65 64 20 74  s preformatted t
6190: 65 78 74 2e 0a 2a 2f 0a 76 6f 69 64 20 68 65 78  ext..*/.void hex
61a0: 64 75 6d 70 5f 70 61 67 65 28 76 6f 69 64 29 7b  dump_page(void){
61b0: 0a 20 20 69 6e 74 20 72 69 64 3b 0a 20 20 42 6c  .  int rid;.  Bl
61c0: 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a 20 20 42 6c  ob content;.  Bl
61d0: 6f 62 20 64 6f 77 6e 6c 6f 61 64 4e 61 6d 65 3b  ob downloadName;
61e0: 0a 0a 20 20 72 69 64 20 3d 20 6e 61 6d 65 5f 74  ..  rid = name_t
61f0: 6f 5f 72 69 64 28 50 44 28 22 6e 61 6d 65 22 2c  o_rid(PD("name",
6200: 22 30 22 29 29 3b 0a 20 20 6c 6f 67 69 6e 5f 63  "0"));.  login_c
6210: 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73  heck_credentials
6220: 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b 52  ();.  if( !g.okR
6230: 65 61 64 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65  ead ){ login_nee
6240: 64 65 64 28 29 3b 20 72 65 74 75 72 6e 3b 20 7d  ded(); return; }
6250: 0a 20 20 69 66 28 20 72 69 64 3d 3d 30 20 29 7b  .  if( rid==0 ){
6260: 20 63 67 69 5f 72 65 64 69 72 65 63 74 28 22 2f   cgi_redirect("/
6270: 68 6f 6d 65 22 29 3b 20 7d 0a 20 20 69 66 28 20  home"); }.  if( 
6280: 67 2e 6f 6b 41 64 6d 69 6e 20 29 7b 0a 20 20 20  g.okAdmin ){.   
6290: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 75   const char *zUu
62a0: 69 64 20 3d 20 64 62 5f 74 65 78 74 28 22 22 2c  id = db_text("",
62b0: 20 22 53 45 4c 45 43 54 20 75 75 69 64 20 46 52   "SELECT uuid FR
62c0: 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69  OM blob WHERE ri
62d0: 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 20  d=%d", rid);.   
62e0: 20 69 66 28 20 64 62 5f 65 78 69 73 74 73 28 22   if( db_exists("
62f0: 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 73 68  SELECT 1 FROM sh
6300: 75 6e 20 57 48 45 52 45 20 75 75 69 64 3d 27 25  un WHERE uuid='%
6310: 73 27 22 2c 20 7a 55 75 69 64 29 20 29 7b 0a 20  s'", zUuid) ){. 
6320: 20 20 20 20 20 73 74 79 6c 65 5f 73 75 62 6d 65       style_subme
6330: 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 55 6e 73 68  nu_element("Unsh
6340: 75 6e 22 2c 22 55 6e 73 68 75 6e 22 2c 20 22 25  un","Unshun", "%
6350: 73 2f 73 68 75 6e 3f 75 75 69 64 3d 25 73 26 73  s/shun?uuid=%s&s
6360: 75 62 3d 31 22 2c 0a 20 20 20 20 20 20 20 20 20  ub=1",.         
6370: 20 20 20 67 2e 7a 54 6f 70 2c 20 7a 55 75 69 64     g.zTop, zUuid
6380: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
6390: 20 20 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e      style_submen
63a0: 75 5f 65 6c 65 6d 65 6e 74 28 22 53 68 75 6e 22  u_element("Shun"
63b0: 2c 22 53 68 75 6e 22 2c 20 22 25 73 2f 73 68 75  ,"Shun", "%s/shu
63c0: 6e 3f 73 68 75 6e 3d 25 73 23 61 64 64 73 68 75  n?shun=%s#addshu
63d0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
63e0: 67 2e 7a 54 6f 70 2c 20 7a 55 75 69 64 29 3b 0a  g.zTop, zUuid);.
63f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74 79 6c      }.  }.  styl
6400: 65 5f 68 65 61 64 65 72 28 22 48 65 78 20 41 72  e_header("Hex Ar
6410: 74 69 66 61 63 74 20 43 6f 6e 74 65 6e 74 22 29  tifact Content")
6420: 3b 0a 20 20 40 20 3c 68 32 3e 48 65 78 61 64 65  ;.  @ <h2>Hexade
6430: 63 69 6d 61 6c 20 43 6f 6e 74 65 6e 74 20 4f 66  cimal Content Of
6440: 3a 3c 2f 68 32 3e 0a 20 20 40 20 3c 62 6c 6f 63  :</h2>.  @ <bloc
6450: 6b 71 75 6f 74 65 3e 0a 20 20 62 6c 6f 62 5f 7a  kquote>.  blob_z
6460: 65 72 6f 28 26 64 6f 77 6e 6c 6f 61 64 4e 61 6d  ero(&downloadNam
6470: 65 29 3b 0a 20 20 6f 62 6a 65 63 74 5f 64 65 73  e);.  object_des
6480: 63 72 69 70 74 69 6f 6e 28 72 69 64 2c 20 30 2c  cription(rid, 0,
6490: 20 26 64 6f 77 6e 6c 6f 61 64 4e 61 6d 65 29 3b   &downloadName);
64a0: 0a 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75  .  style_submenu
64b0: 5f 65 6c 65 6d 65 6e 74 28 22 44 6f 77 6e 6c 6f  _element("Downlo
64c0: 61 64 22 2c 20 22 44 6f 77 6e 6c 6f 61 64 22 2c  ad", "Download",
64d0: 20 0a 20 20 20 20 20 20 20 20 22 25 73 2f 72 61   .        "%s/ra
64e0: 77 2f 25 54 3f 6e 61 6d 65 3d 25 64 22 2c 20 67  w/%T?name=%d", g
64f0: 2e 7a 42 61 73 65 55 52 4c 2c 20 62 6c 6f 62 5f  .zBaseURL, blob_
6500: 73 74 72 28 26 64 6f 77 6e 6c 6f 61 64 4e 61 6d  str(&downloadNam
6510: 65 29 2c 20 72 69 64 29 3b 0a 20 20 40 20 3c 2f  e), rid);.  @ </
6520: 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 40 20  blockquote>.  @ 
6530: 3c 68 72 3e 0a 20 20 63 6f 6e 74 65 6e 74 5f 67  <hr>.  content_g
6540: 65 74 28 72 69 64 2c 20 26 63 6f 6e 74 65 6e 74  et(rid, &content
6550: 29 3b 0a 20 20 40 20 3c 62 6c 6f 63 6b 71 75 6f  );.  @ <blockquo
6560: 74 65 3e 3c 70 72 65 3e 0a 20 20 68 65 78 64 75  te><pre>.  hexdu
6570: 6d 70 28 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20  mp(&content);.  
6580: 40 20 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71  @ </pre></blockq
6590: 75 6f 74 65 3e 0a 20 20 73 74 79 6c 65 5f 66 6f  uote>.  style_fo
65a0: 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  oter();.}../*.**
65b0: 20 57 45 42 50 41 47 45 3a 20 61 72 74 69 66 61   WEBPAGE: artifa
65c0: 63 74 0a 2a 2a 20 55 52 4c 3a 20 2f 61 72 74 69  ct.** URL: /arti
65d0: 66 61 63 74 3f 6e 61 6d 65 3d 41 52 54 49 46 41  fact?name=ARTIFA
65e0: 43 54 49 44 0a 2a 2a 20 0a 2a 2a 20 53 68 6f 77  CTID.** .** Show
65f0: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f   the complete co
6600: 6e 74 65 6e 74 20 6f 66 20 61 20 66 69 6c 65 20  ntent of a file 
6610: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 41 52  identified by AR
6620: 54 49 46 41 43 54 49 44 0a 2a 2a 20 61 73 20 70  TIFACTID.** as p
6630: 72 65 66 6f 72 6d 61 74 74 65 64 20 74 65 78 74  reformatted text
6640: 2e 0a 2a 2f 0a 76 6f 69 64 20 61 72 74 69 66 61  ..*/.void artifa
6650: 63 74 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20  ct_page(void){. 
6660: 20 69 6e 74 20 72 69 64 3b 0a 20 20 42 6c 6f 62   int rid;.  Blob
6670: 20 63 6f 6e 74 65 6e 74 3b 0a 20 20 63 6f 6e 73   content;.  cons
6680: 74 20 63 68 61 72 20 2a 7a 4d 69 6d 65 3b 0a 20  t char *zMime;. 
6690: 20 42 6c 6f 62 20 64 6f 77 6e 6c 6f 61 64 4e 61   Blob downloadNa
66a0: 6d 65 3b 0a 20 20 69 6e 74 20 72 65 6e 64 65 72  me;.  int render
66b0: 41 73 57 69 6b 69 20 3d 20 30 3b 0a 20 20 69 6e  AsWiki = 0;.  in
66c0: 74 20 72 65 6e 64 65 72 41 73 48 74 6d 6c 20 3d  t renderAsHtml =
66d0: 20 30 3b 0a 0a 20 20 72 69 64 20 3d 20 6e 61 6d   0;..  rid = nam
66e0: 65 5f 74 6f 5f 72 69 64 28 50 44 28 22 6e 61 6d  e_to_rid(PD("nam
66f0: 65 22 2c 22 30 22 29 29 3b 0a 20 20 6c 6f 67 69  e","0"));.  logi
6700: 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69  n_check_credenti
6710: 61 6c 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e  als();.  if( !g.
6720: 6f 6b 52 65 61 64 20 29 7b 20 6c 6f 67 69 6e 5f  okRead ){ login_
6730: 6e 65 65 64 65 64 28 29 3b 20 72 65 74 75 72 6e  needed(); return
6740: 3b 20 7d 0a 20 20 69 66 28 20 72 69 64 3d 3d 30  ; }.  if( rid==0
6750: 20 29 7b 20 63 67 69 5f 72 65 64 69 72 65 63 74   ){ cgi_redirect
6760: 28 22 2f 68 6f 6d 65 22 29 3b 20 7d 0a 20 20 69  ("/home"); }.  i
6770: 66 28 20 67 2e 6f 6b 41 64 6d 69 6e 20 29 7b 0a  f( g.okAdmin ){.
6780: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
6790: 7a 55 75 69 64 20 3d 20 64 62 5f 74 65 78 74 28  zUuid = db_text(
67a0: 22 22 2c 20 22 53 45 4c 45 43 54 20 75 75 69 64  "", "SELECT uuid
67b0: 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45   FROM blob WHERE
67c0: 20 72 69 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a   rid=%d", rid);.
67d0: 20 20 20 20 69 66 28 20 64 62 5f 65 78 69 73 74      if( db_exist
67e0: 73 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  s("SELECT 1 FROM
67f0: 20 73 68 75 6e 20 57 48 45 52 45 20 75 75 69 64   shun WHERE uuid
6800: 3d 27 25 73 27 22 2c 20 7a 55 75 69 64 29 20 29  ='%s'", zUuid) )
6810: 7b 0a 20 20 20 20 20 20 73 74 79 6c 65 5f 73 75  {.      style_su
6820: 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 55  bmenu_element("U
6830: 6e 73 68 75 6e 22 2c 22 55 6e 73 68 75 6e 22 2c  nshun","Unshun",
6840: 20 22 25 73 2f 73 68 75 6e 3f 75 75 69 64 3d 25   "%s/shun?uuid=%
6850: 73 26 73 75 62 3d 31 22 2c 0a 20 20 20 20 20 20  s&sub=1",.      
6860: 20 20 20 20 20 20 67 2e 7a 54 6f 70 2c 20 7a 55        g.zTop, zU
6870: 75 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  uid);.    }else{
6880: 0a 20 20 20 20 20 20 73 74 79 6c 65 5f 73 75 62  .      style_sub
6890: 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 53 68  menu_element("Sh
68a0: 75 6e 22 2c 22 53 68 75 6e 22 2c 20 22 25 73 2f  un","Shun", "%s/
68b0: 73 68 75 6e 3f 73 68 75 6e 3d 25 73 23 61 64 64  shun?shun=%s#add
68c0: 73 68 75 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  shun",.         
68d0: 20 20 20 67 2e 7a 54 6f 70 2c 20 7a 55 75 69 64     g.zTop, zUuid
68e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
68f0: 74 79 6c 65 5f 68 65 61 64 65 72 28 22 41 72 74  tyle_header("Art
6900: 69 66 61 63 74 20 43 6f 6e 74 65 6e 74 22 29 3b  ifact Content");
6910: 0a 20 20 40 20 3c 68 32 3e 43 6f 6e 74 65 6e 74  .  @ <h2>Content
6920: 20 4f 66 3a 3c 2f 68 32 3e 0a 20 20 40 20 3c 62   Of:</h2>.  @ <b
6930: 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 62 6c 6f  lockquote>.  blo
6940: 62 5f 7a 65 72 6f 28 26 64 6f 77 6e 6c 6f 61 64  b_zero(&download
6950: 4e 61 6d 65 29 3b 0a 20 20 6f 62 6a 65 63 74 5f  Name);.  object_
6960: 64 65 73 63 72 69 70 74 69 6f 6e 28 72 69 64 2c  description(rid,
6970: 20 30 2c 20 26 64 6f 77 6e 6c 6f 61 64 4e 61 6d   0, &downloadNam
6980: 65 29 3b 0a 20 20 73 74 79 6c 65 5f 73 75 62 6d  e);.  style_subm
6990: 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 44 6f 77  enu_element("Dow
69a0: 6e 6c 6f 61 64 22 2c 20 22 44 6f 77 6e 6c 6f 61  nload", "Downloa
69b0: 64 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  d", .          "
69c0: 25 73 2f 72 61 77 2f 25 54 3f 6e 61 6d 65 3d 25  %s/raw/%T?name=%
69d0: 64 22 2c 20 67 2e 7a 54 6f 70 2c 20 62 6c 6f 62  d", g.zTop, blob
69e0: 5f 73 74 72 28 26 64 6f 77 6e 6c 6f 61 64 4e 61  _str(&downloadNa
69f0: 6d 65 29 2c 20 72 69 64 29 3b 0a 20 20 7a 4d 69  me), rid);.  zMi
6a00: 6d 65 20 3d 20 6d 69 6d 65 74 79 70 65 5f 66 72  me = mimetype_fr
6a10: 6f 6d 5f 6e 61 6d 65 28 62 6c 6f 62 5f 73 74 72  om_name(blob_str
6a20: 28 26 64 6f 77 6e 6c 6f 61 64 4e 61 6d 65 29 29  (&downloadName))
6a30: 3b 0a 20 20 69 66 28 20 7a 4d 69 6d 65 20 29 7b  ;.  if( zMime ){
6a40: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
6a50: 7a 4d 69 6d 65 2c 20 22 74 65 78 74 2f 68 74 6d  zMime, "text/htm
6a60: 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  l")==0 ){.      
6a70: 69 66 28 20 50 28 22 74 78 74 22 29 20 29 7b 0a  if( P("txt") ){.
6a80: 20 20 20 20 20 20 20 20 73 74 79 6c 65 5f 73 75          style_su
6a90: 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 48  bmenu_element("H
6aa0: 74 6d 6c 22 2c 20 22 48 74 6d 6c 22 2c 0a 20 20  tml", "Html",.  
6ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ac0: 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73 2f              "%s/
6ad0: 61 72 74 69 66 61 63 74 3f 6e 61 6d 65 3d 25 64  artifact?name=%d
6ae0: 22 2c 20 67 2e 7a 54 6f 70 2c 20 72 69 64 29 3b  ", g.zTop, rid);
6af0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6b00: 20 20 20 20 20 20 72 65 6e 64 65 72 41 73 48 74        renderAsHt
6b10: 6d 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ml = 1;.        
6b20: 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c  style_submenu_el
6b30: 65 6d 65 6e 74 28 22 54 65 78 74 22 2c 20 22 54  ement("Text", "T
6b40: 65 78 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ext",.          
6b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b60: 20 20 20 20 22 25 73 2f 61 72 74 69 66 61 63 74      "%s/artifact
6b70: 3f 6e 61 6d 65 3d 25 64 26 74 78 74 3d 31 22 2c  ?name=%d&txt=1",
6b80: 20 67 2e 7a 54 6f 70 2c 20 72 69 64 29 3b 0a 20   g.zTop, rid);. 
6b90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
6ba0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4d 69 6d   if( strcmp(zMim
6bb0: 65 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  e, "application/
6bc0: 78 2d 66 6f 73 73 69 6c 2d 77 69 6b 69 22 29 3d  x-fossil-wiki")=
6bd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
6be0: 50 28 22 74 78 74 22 29 20 29 7b 0a 20 20 20 20  P("txt") ){.    
6bf0: 20 20 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e      style_submen
6c00: 75 5f 65 6c 65 6d 65 6e 74 28 22 57 69 6b 69 22  u_element("Wiki"
6c10: 2c 20 22 57 69 6b 69 22 2c 0a 20 20 20 20 20 20  , "Wiki",.      
6c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c30: 20 20 20 20 20 20 20 20 22 25 73 2f 61 72 74 69          "%s/arti
6c40: 66 61 63 74 3f 6e 61 6d 65 3d 25 64 22 2c 20 67  fact?name=%d", g
6c50: 2e 7a 54 6f 70 2c 20 72 69 64 29 3b 0a 20 20 20  .zTop, rid);.   
6c60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6c70: 20 20 72 65 6e 64 65 72 41 73 57 69 6b 69 20 3d    renderAsWiki =
6c80: 20 31 3b 0a 20 20 20 20 20 20 20 20 73 74 79 6c   1;.        styl
6c90: 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e  e_submenu_elemen
6ca0: 74 28 22 54 65 78 74 22 2c 20 22 54 65 78 74 22  t("Text", "Text"
6cb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cd0: 22 25 73 2f 61 72 74 69 66 61 63 74 3f 6e 61 6d  "%s/artifact?nam
6ce0: 65 3d 25 64 26 74 78 74 3d 31 22 2c 20 67 2e 7a  e=%d&txt=1", g.z
6cf0: 54 6f 70 2c 20 72 69 64 29 3b 0a 20 20 20 20 20  Top, rid);.     
6d00: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 40   }.    }.  }.  @
6d10: 20 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20   </blockquote>. 
6d20: 20 40 20 3c 68 72 3e 0a 20 20 63 6f 6e 74 65 6e   @ <hr>.  conten
6d30: 74 5f 67 65 74 28 72 69 64 2c 20 26 63 6f 6e 74  t_get(rid, &cont
6d40: 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 65 6e 64  ent);.  if( rend
6d50: 65 72 41 73 57 69 6b 69 20 29 7b 0a 20 20 20 20  erAsWiki ){.    
6d60: 77 69 6b 69 5f 63 6f 6e 76 65 72 74 28 26 63 6f  wiki_convert(&co
6d70: 6e 74 65 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20  ntent, 0, 0);.  
6d80: 7d 65 6c 73 65 20 69 66 28 20 72 65 6e 64 65 72  }else if( render
6d90: 41 73 48 74 6d 6c 20 29 7b 0a 20 20 20 20 40 20  AsHtml ){.    @ 
6da0: 3c 64 69 76 3e 0a 20 20 20 20 63 67 69 5f 61 70  <div>.    cgi_ap
6db0: 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 62 6c 6f  pend_content(blo
6dc0: 62 5f 62 75 66 66 65 72 28 26 63 6f 6e 74 65 6e  b_buffer(&conten
6dd0: 74 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26 63  t), blob_size(&c
6de0: 6f 6e 74 65 6e 74 29 29 3b 0a 20 20 20 20 40 20  ontent));.    @ 
6df0: 3c 2f 64 69 76 3e 0a 20 20 7d 65 6c 73 65 7b 0a  </div>.  }else{.
6e00: 20 20 20 20 7a 4d 69 6d 65 20 3d 20 6d 69 6d 65      zMime = mime
6e10: 74 79 70 65 5f 66 72 6f 6d 5f 63 6f 6e 74 65 6e  type_from_conten
6e20: 74 28 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  t(&content);.   
6e30: 20 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a   @ <blockquote>.
6e40: 20 20 20 20 69 66 28 20 7a 4d 69 6d 65 3d 3d 30      if( zMime==0
6e50: 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 70 72 65   ){.      @ <pre
6e60: 3e 0a 20 20 20 20 20 20 40 20 25 68 28 62 6c 6f  >.      @ %h(blo
6e70: 62 5f 73 74 72 28 26 63 6f 6e 74 65 6e 74 29 29  b_str(&content))
6e80: 0a 20 20 20 20 20 20 40 20 3c 2f 70 72 65 3e 0a  .      @ </pre>.
6e90: 20 20 20 20 20 20 73 74 79 6c 65 5f 73 75 62 6d        style_subm
6ea0: 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 48 65 78  enu_element("Hex
6eb0: 22 2c 22 48 65 78 22 2c 20 22 25 73 2f 68 65 78  ","Hex", "%s/hex
6ec0: 64 75 6d 70 3f 6e 61 6d 65 3d 25 64 22 2c 20 67  dump?name=%d", g
6ed0: 2e 7a 54 6f 70 2c 20 72 69 64 29 3b 0a 20 20 20  .zTop, rid);.   
6ee0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63   }else if( strnc
6ef0: 6d 70 28 7a 4d 69 6d 65 2c 20 22 69 6d 61 67 65  mp(zMime, "image
6f00: 2f 22 2c 20 36 29 3d 3d 30 20 29 7b 0a 20 20 20  /", 6)==0 ){.   
6f10: 20 20 20 40 20 3c 69 6d 67 20 73 72 63 3d 22 25     @ <img src="%
6f20: 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 72 61  s(g.zBaseURL)/ra
6f30: 77 3f 6e 61 6d 65 3d 25 64 28 72 69 64 29 26 6d  w?name=%d(rid)&m
6f40: 3d 25 73 28 7a 4d 69 6d 65 29 22 3e 3c 2f 69 6d  =%s(zMime)"></im
6f50: 67 3e 0a 20 20 20 20 20 20 73 74 79 6c 65 5f 73  g>.      style_s
6f60: 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22  ubmenu_element("
6f70: 48 65 78 22 2c 22 48 65 78 22 2c 20 22 25 73 2f  Hex","Hex", "%s/
6f80: 68 65 78 64 75 6d 70 3f 6e 61 6d 65 3d 25 64 22  hexdump?name=%d"
6f90: 2c 20 67 2e 7a 54 6f 70 2c 20 72 69 64 29 3b 0a  , g.zTop, rid);.
6fa0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6fb0: 20 40 20 3c 70 72 65 3e 0a 20 20 20 20 20 20 68   @ <pre>.      h
6fc0: 65 78 64 75 6d 70 28 26 63 6f 6e 74 65 6e 74 29  exdump(&content)
6fd0: 3b 0a 20 20 20 20 20 20 40 20 3c 2f 70 72 65 3e  ;.      @ </pre>
6fe0: 0a 20 20 20 20 7d 0a 20 20 20 20 40 20 3c 2f 62  .    }.    @ </b
6ff0: 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 7d 0a 20  lockquote>.  }. 
7000: 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b   style_footer();
7010: 0a 7d 20 20 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50  .}  ../*.** WEBP
7020: 41 47 45 3a 20 74 69 6e 66 6f 0a 2a 2a 20 55 52  AGE: tinfo.** UR
7030: 4c 3a 20 2f 74 69 6e 66 6f 3f 6e 61 6d 65 3d 41  L: /tinfo?name=A
7040: 52 54 49 46 41 43 54 49 44 0a 2a 2a 0a 2a 2a 20  RTIFACTID.**.** 
7050: 53 68 6f 77 20 74 68 65 20 64 65 74 61 69 6c 73  Show the details
7060: 20 6f 66 20 61 20 74 69 63 6b 65 74 20 63 68 61   of a ticket cha
7070: 6e 67 65 20 63 6f 6e 74 72 6f 6c 20 61 72 74 69  nge control arti
7080: 66 61 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 74 69  fact..*/.void ti
7090: 6e 66 6f 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a  nfo_page(void){.
70a0: 20 20 69 6e 74 20 72 69 64 3b 0a 20 20 42 6c 6f    int rid;.  Blo
70b0: 62 20 63 6f 6e 74 65 6e 74 3b 0a 20 20 63 68 61  b content;.  cha
70c0: 72 20 2a 7a 44 61 74 65 3b 0a 20 20 63 6f 6e 73  r *zDate;.  cons
70d0: 74 20 63 68 61 72 20 2a 7a 55 75 69 64 3b 0a 20  t char *zUuid;. 
70e0: 20 63 68 61 72 20 7a 54 6b 74 4e 61 6d 65 5b 32   char zTktName[2
70f0: 30 5d 3b 0a 20 20 4d 61 6e 69 66 65 73 74 20 6d  0];.  Manifest m
7100: 3b 0a 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b  ;..  login_check
7110: 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a  _credentials();.
7120: 20 20 69 66 28 20 21 67 2e 6f 6b 52 64 54 6b 74    if( !g.okRdTkt
7130: 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64   ){ login_needed
7140: 28 29 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20  (); return; }.  
7150: 72 69 64 20 3d 20 6e 61 6d 65 5f 74 6f 5f 72 69  rid = name_to_ri
7160: 64 28 50 44 28 22 6e 61 6d 65 22 2c 22 30 22 29  d(PD("name","0")
7170: 29 3b 0a 20 20 69 66 28 20 72 69 64 3d 3d 30 20  );.  if( rid==0 
7180: 29 7b 20 66 6f 73 73 69 6c 5f 72 65 64 69 72 65  ){ fossil_redire
7190: 63 74 5f 68 6f 6d 65 28 29 3b 20 7d 0a 20 20 7a  ct_home(); }.  z
71a0: 55 75 69 64 20 3d 20 64 62 5f 74 65 78 74 28 22  Uuid = db_text("
71b0: 22 2c 20 22 53 45 4c 45 43 54 20 75 75 69 64 20  ", "SELECT uuid 
71c0: 46 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20  FROM blob WHERE 
71d0: 72 69 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20  rid=%d", rid);. 
71e0: 20 69 66 28 20 67 2e 6f 6b 41 64 6d 69 6e 20 29   if( g.okAdmin )
71f0: 7b 0a 20 20 20 20 69 66 28 20 64 62 5f 65 78 69  {.    if( db_exi
7200: 73 74 73 28 22 53 45 4c 45 43 54 20 31 20 46 52  sts("SELECT 1 FR
7210: 4f 4d 20 73 68 75 6e 20 57 48 45 52 45 20 75 75  OM shun WHERE uu
7220: 69 64 3d 27 25 73 27 22 2c 20 7a 55 75 69 64 29  id='%s'", zUuid)
7230: 20 29 7b 0a 20 20 20 20 20 20 73 74 79 6c 65 5f   ){.      style_
7240: 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28  submenu_element(
7250: 22 55 6e 73 68 75 6e 22 2c 22 55 6e 73 68 75 6e  "Unshun","Unshun
7260: 22 2c 20 22 25 73 2f 73 68 75 6e 3f 75 75 69 64  ", "%s/shun?uuid
7270: 3d 25 73 26 73 75 62 3d 31 22 2c 0a 20 20 20 20  =%s&sub=1",.    
7280: 20 20 20 20 20 20 20 20 67 2e 7a 54 6f 70 2c 20          g.zTop, 
7290: 7a 55 75 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73  zUuid);.    }els
72a0: 65 7b 0a 20 20 20 20 20 20 73 74 79 6c 65 5f 73  e{.      style_s
72b0: 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22  ubmenu_element("
72c0: 53 68 75 6e 22 2c 22 53 68 75 6e 22 2c 20 22 25  Shun","Shun", "%
72d0: 73 2f 73 68 75 6e 3f 73 68 75 6e 3d 25 73 23 61  s/shun?shun=%s#a
72e0: 64 64 73 68 75 6e 22 2c 0a 20 20 20 20 20 20 20  ddshun",.       
72f0: 20 20 20 20 20 67 2e 7a 54 6f 70 2c 20 7a 55 75       g.zTop, zUu
7300: 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  id);.    }.  }. 
7310: 20 63 6f 6e 74 65 6e 74 5f 67 65 74 28 72 69 64   content_get(rid
7320: 2c 20 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 69  , &content);.  i
7330: 66 28 20 6d 61 6e 69 66 65 73 74 5f 70 61 72 73  f( manifest_pars
7340: 65 28 26 6d 2c 20 26 63 6f 6e 74 65 6e 74 29 3d  e(&m, &content)=
7350: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c  =0 ){.    fossil
7360: 5f 72 65 64 69 72 65 63 74 5f 68 6f 6d 65 28 29  _redirect_home()
7370: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 2e 74 79  ;.  }.  if( m.ty
7380: 70 65 21 3d 43 46 54 59 50 45 5f 54 49 43 4b 45  pe!=CFTYPE_TICKE
7390: 54 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f  T ){.    fossil_
73a0: 72 65 64 69 72 65 63 74 5f 68 6f 6d 65 28 29 3b  redirect_home();
73b0: 0a 20 20 7d 0a 20 20 73 74 79 6c 65 5f 68 65 61  .  }.  style_hea
73c0: 64 65 72 28 22 54 69 63 6b 65 74 20 43 68 61 6e  der("Ticket Chan
73d0: 67 65 20 44 65 74 61 69 6c 73 22 29 3b 0a 20 20  ge Details");.  
73e0: 7a 44 61 74 65 20 3d 20 64 62 5f 74 65 78 74 28  zDate = db_text(
73f0: 30 2c 20 22 53 45 4c 45 43 54 20 64 61 74 65 74  0, "SELECT datet
7400: 69 6d 65 28 25 2e 31 32 66 29 22 2c 20 6d 2e 72  ime(%.12f)", m.r
7410: 44 61 74 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28  Date);.  memcpy(
7420: 7a 54 6b 74 4e 61 6d 65 2c 20 6d 2e 7a 54 69 63  zTktName, m.zTic
7430: 6b 65 74 55 75 69 64 2c 20 31 30 29 3b 0a 20 20  ketUuid, 10);.  
7440: 7a 54 6b 74 4e 61 6d 65 5b 31 30 5d 20 3d 20 30  zTktName[10] = 0
7450: 3b 0a 20 20 40 20 3c 68 32 3e 43 68 61 6e 67 65  ;.  @ <h2>Change
7460: 73 20 74 6f 20 74 69 63 6b 65 74 20 3c 61 20 68  s to ticket <a h
7470: 72 65 66 3d 22 25 73 28 6d 2e 7a 54 69 63 6b 65  ref="%s(m.zTicke
7480: 74 55 75 69 64 29 22 3e 25 73 28 7a 54 6b 74 4e  tUuid)">%s(zTktN
7490: 61 6d 65 29 3c 2f 61 3e 3c 2f 68 32 3e 0a 20 20  ame)</a></h2>.  
74a0: 40 0a 20 20 40 20 3c 70 3e 42 79 20 25 68 28 6d  @.  @ <p>By %h(m
74b0: 2e 7a 55 73 65 72 29 20 6f 6e 20 25 73 28 7a 44  .zUser) on %s(zD
74c0: 61 74 65 29 2e 20 20 53 65 65 20 61 6c 73 6f 3a  ate).  See also:
74d0: 0a 20 20 40 20 3c 61 20 68 72 65 66 3d 22 25 73  .  @ <a href="%s
74e0: 28 67 2e 7a 54 6f 70 29 2f 61 72 74 69 66 61 63  (g.zTop)/artifac
74f0: 74 2f 25 54 28 7a 55 75 69 64 29 22 3e 61 72 74  t/%T(zUuid)">art
7500: 69 66 61 63 74 20 63 6f 6e 74 65 6e 74 3c 2f 61  ifact content</a
7510: 3e 2c 20 61 6e 64 0a 20 20 40 20 3c 61 20 68 72  >, and.  @ <a hr
7520: 65 66 3d 22 25 73 28 67 2e 7a 54 6f 70 29 2f 74  ef="%s(g.zTop)/t
7530: 6b 74 68 69 73 74 6f 72 79 2f 25 73 28 6d 2e 7a  kthistory/%s(m.z
7540: 54 69 63 6b 65 74 55 75 69 64 29 22 3e 74 69 63  TicketUuid)">tic
7550: 6b 65 74 20 68 69 73 74 6f 72 79 3c 2f 61 3e 0a  ket history</a>.
7560: 20 20 40 20 3c 2f 70 3e 0a 20 20 40 0a 20 20 40    @ </p>.  @.  @
7570: 20 3c 6f 6c 3e 0a 20 20 66 72 65 65 28 7a 44 61   <ol>.  free(zDa
7580: 74 65 29 3b 0a 20 20 74 69 63 6b 65 74 5f 6f 75  te);.  ticket_ou
7590: 74 70 75 74 5f 63 68 61 6e 67 65 5f 61 72 74 69  tput_change_arti
75a0: 66 61 63 74 28 26 6d 29 3b 0a 20 20 6d 61 6e 69  fact(&m);.  mani
75b0: 66 65 73 74 5f 63 6c 65 61 72 28 26 6d 29 3b 0a  fest_clear(&m);.
75c0: 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29    style_footer()
75d0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50  ;.}.../*.** WEBP
75e0: 41 47 45 3a 20 69 6e 66 6f 0a 2a 2a 20 55 52 4c  AGE: info.** URL
75f0: 3a 20 69 6e 66 6f 2f 41 52 54 49 46 41 43 54 49  : info/ARTIFACTI
7600: 44 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  D.**.** The argu
7610: 6d 65 6e 74 20 69 73 20 61 20 61 72 74 69 66 61  ment is a artifa
7620: 63 74 20 49 44 20 77 68 69 63 68 20 6d 69 67 68  ct ID which migh
7630: 74 20 62 65 20 61 20 62 61 73 65 6c 69 6e 65 20  t be a baseline 
7640: 6f 72 20 61 20 66 69 6c 65 20 6f 72 0a 2a 2a 20  or a file or.** 
7650: 61 20 74 69 63 6b 65 74 20 63 68 61 6e 67 65 73  a ticket changes
7660: 20 6f 72 20 61 20 77 69 6b 69 20 65 64 69 74 6f   or a wiki edito
7670: 72 20 6f 72 20 73 6f 6d 65 74 68 69 6e 67 20 65  r or something e
7680: 6c 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 46 69 67 75  lse. .**.** Figu
7690: 72 65 20 6f 75 74 20 77 68 61 74 20 74 68 65 20  re out what the 
76a0: 61 72 74 69 66 61 63 74 20 49 44 20 69 73 20 61  artifact ID is a
76b0: 6e 64 20 6a 75 6d 70 20 74 6f 20 69 74 2e 0a 2a  nd jump to it..*
76c0: 2f 0a 76 6f 69 64 20 69 6e 66 6f 5f 70 61 67 65  /.void info_page
76d0: 28 76 6f 69 64 29 7b 0a 20 20 63 6f 6e 73 74 20  (void){.  const 
76e0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 42  char *zName;.  B
76f0: 6c 6f 62 20 75 75 69 64 3b 0a 20 20 69 6e 74 20  lob uuid;.  int 
7700: 72 69 64 2c 20 6e 4e 61 6d 65 3b 0a 20 20 0a 20  rid, nName;.  . 
7710: 20 7a 4e 61 6d 65 20 3d 20 50 28 22 6e 61 6d 65   zName = P("name
7720: 22 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ");.  if( zName=
7730: 3d 30 20 29 20 66 6f 73 73 69 6c 5f 72 65 64 69  =0 ) fossil_redi
7740: 72 65 63 74 5f 68 6f 6d 65 28 29 3b 0a 20 20 6e  rect_home();.  n
7750: 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e  Name = strlen(zN
7760: 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 4e 61 6d  ame);.  if( nNam
7770: 65 3c 34 20 7c 7c 20 6e 4e 61 6d 65 3e 55 55 49  e<4 || nName>UUI
7780: 44 5f 53 49 5a 45 20 7c 7c 20 21 76 61 6c 69 64  D_SIZE || !valid
7790: 61 74 65 31 36 28 7a 4e 61 6d 65 2c 20 6e 4e 61  ate16(zName, nNa
77a0: 6d 65 29 20 29 7b 0a 20 20 20 20 73 77 69 74 63  me) ){.    switc
77b0: 68 28 20 73 79 6d 5f 74 61 67 5f 74 6f 5f 75 75  h( sym_tag_to_uu
77c0: 69 64 28 7a 4e 61 6d 65 2c 20 26 75 75 69 64 29  id(zName, &uuid)
77d0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 31   ){.      case 1
77e0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 67  : {.        /* g
77f0: 6f 74 20 6f 6e 65 20 55 55 49 44 2c 20 75 73 65  ot one UUID, use
7800: 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a   it */.        z
7810: 4e 61 6d 65 20 3d 20 62 6c 6f 62 5f 73 74 72 28  Name = blob_str(
7820: 26 75 75 69 64 29 3b 0a 20 20 20 20 20 20 20 20  &uuid);.        
7830: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
7840: 20 20 20 20 20 63 61 73 65 20 32 3a 20 7b 0a 20       case 2: {. 
7850: 20 20 20 20 20 20 20 2f 2a 20 67 6f 20 73 6f 6d         /* go som
7860: 65 77 68 65 72 65 20 74 6f 20 73 68 6f 77 20 74  ewhere to show t
7870: 68 65 20 6d 75 6c 74 69 70 6c 65 20 55 55 49 44  he multiple UUID
7880: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  s */.        ret
7890: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 62 72 65  urn;.        bre
78a0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
78b0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
78c0: 20 20 20 20 20 66 6f 73 73 69 6c 5f 72 65 64 69       fossil_redi
78d0: 72 65 63 74 5f 68 6f 6d 65 28 29 3b 0a 20 20 20  rect_home();.   
78e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
78f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
7900: 69 66 28 20 64 62 5f 65 78 69 73 74 73 28 22 53  if( db_exists("S
7910: 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 74 69 63  ELECT 1 FROM tic
7920: 6b 65 74 20 57 48 45 52 45 20 74 6b 74 5f 75 75  ket WHERE tkt_uu
7930: 69 64 20 47 4c 4f 42 20 27 25 73 2a 27 22 2c 20  id GLOB '%s*'", 
7940: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 74 6b  zName) ){.    tk
7950: 74 76 69 65 77 5f 70 61 67 65 28 29 3b 0a 20 20  tview_page();.  
7960: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
7970: 72 69 64 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20  rid = db_int(0, 
7980: 22 53 45 4c 45 43 54 20 72 69 64 20 46 52 4f 4d  "SELECT rid FROM
7990: 20 62 6c 6f 62 20 57 48 45 52 45 20 75 75 69 64   blob WHERE uuid
79a0: 20 47 4c 4f 42 20 27 25 73 2a 27 22 2c 20 7a 4e   GLOB '%s*'", zN
79b0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 72 69 64 3d  ame);.  if( rid=
79c0: 3d 30 20 29 7b 0a 20 20 20 20 73 74 79 6c 65 5f  =0 ){.    style_
79d0: 68 65 61 64 65 72 28 22 42 72 6f 6b 65 6e 20 4c  header("Broken L
79e0: 69 6e 6b 22 29 3b 0a 20 20 20 20 40 20 3c 70 3e  ink");.    @ <p>
79f0: 4e 6f 20 73 75 63 68 20 6f 62 6a 65 63 74 3a 20  No such object: 
7a00: 25 68 28 7a 4e 61 6d 65 29 3c 2f 70 3e 0a 20 20  %h(zName)</p>.  
7a10: 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29    style_footer()
7a20: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
7a30: 7d 0a 20 20 69 66 28 20 64 62 5f 65 78 69 73 74  }.  if( db_exist
7a40: 73 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  s("SELECT 1 FROM
7a50: 20 6d 6c 69 6e 6b 20 57 48 45 52 45 20 6d 69 64   mlink WHERE mid
7a60: 3d 25 64 22 2c 20 72 69 64 29 20 29 7b 0a 20 20  =%d", rid) ){.  
7a70: 20 20 63 69 5f 70 61 67 65 28 29 3b 0a 20 20 7d    ci_page();.  }
7a80: 65 6c 73 65 0a 20 20 69 66 28 20 64 62 5f 65 78  else.  if( db_ex
7a90: 69 73 74 73 28 22 53 45 4c 45 43 54 20 31 20 46  ists("SELECT 1 F
7aa0: 52 4f 4d 20 74 61 67 78 72 65 66 20 4a 4f 49 4e  ROM tagxref JOIN
7ab0: 20 74 61 67 20 55 53 49 4e 47 28 74 61 67 69 64   tag USING(tagid
7ac0: 29 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )".             
7ad0: 20 20 20 22 20 57 48 45 52 45 20 72 69 64 3d 25     " WHERE rid=%
7ae0: 64 20 41 4e 44 20 74 61 67 6e 61 6d 65 20 4c 49  d AND tagname LI
7af0: 4b 45 20 27 77 69 6b 69 2d 25 25 27 22 2c 20 72  KE 'wiki-%%'", r
7b00: 69 64 29 20 29 7b 0a 20 20 20 20 77 69 6e 66 6f  id) ){.    winfo
7b10: 5f 70 61 67 65 28 29 3b 0a 20 20 7d 65 6c 73 65  _page();.  }else
7b20: 0a 20 20 69 66 28 20 64 62 5f 65 78 69 73 74 73  .  if( db_exists
7b30: 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20  ("SELECT 1 FROM 
7b40: 74 61 67 78 72 65 66 20 4a 4f 49 4e 20 74 61 67  tagxref JOIN tag
7b50: 20 55 53 49 4e 47 28 74 61 67 69 64 29 22 0a 20   USING(tagid)". 
7b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
7b70: 20 57 48 45 52 45 20 72 69 64 3d 25 64 20 41 4e   WHERE rid=%d AN
7b80: 44 20 74 61 67 6e 61 6d 65 20 4c 49 4b 45 20 27  D tagname LIKE '
7b90: 74 6b 74 2d 25 25 27 22 2c 20 72 69 64 29 20 29  tkt-%%'", rid) )
7ba0: 7b 0a 20 20 20 20 74 69 6e 66 6f 5f 70 61 67 65  {.    tinfo_page
7bb0: 28 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66  ();.  }else.  if
7bc0: 28 20 64 62 5f 65 78 69 73 74 73 28 22 53 45 4c  ( db_exists("SEL
7bd0: 45 43 54 20 31 20 46 52 4f 4d 20 70 6c 69 6e 6b  ECT 1 FROM plink
7be0: 20 57 48 45 52 45 20 63 69 64 3d 25 64 22 2c 20   WHERE cid=%d", 
7bf0: 72 69 64 29 20 29 7b 0a 20 20 20 20 63 69 5f 70  rid) ){.    ci_p
7c00: 61 67 65 28 29 3b 0a 20 20 7d 65 6c 73 65 0a 20  age();.  }else. 
7c10: 20 69 66 28 20 64 62 5f 65 78 69 73 74 73 28 22   if( db_exists("
7c20: 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 70 6c  SELECT 1 FROM pl
7c30: 69 6e 6b 20 57 48 45 52 45 20 70 69 64 3d 25 64  ink WHERE pid=%d
7c40: 22 2c 20 72 69 64 29 20 29 7b 0a 20 20 20 20 63  ", rid) ){.    c
7c50: 69 5f 70 61 67 65 28 29 3b 0a 20 20 7d 65 6c 73  i_page();.  }els
7c60: 65 0a 20 20 7b 0a 20 20 20 20 61 72 74 69 66 61  e.  {.    artifa
7c70: 63 74 5f 70 61 67 65 28 29 3b 0a 20 20 7d 0a 7d  ct_page();.  }.}
7c80: 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a  ../*.** WEBPAGE:
7c90: 20 63 69 5f 65 64 69 74 0a 2a 2a 20 55 52 4c 3a   ci_edit.** URL:
7ca0: 20 20 63 69 5f 65 64 69 74 3f 72 3d 52 49 44 26    ci_edit?r=RID&
7cb0: 63 3d 4e 45 57 43 4f 4d 4d 45 4e 54 26 75 3d 4e  c=NEWCOMMENT&u=N
7cc0: 45 57 55 53 45 52 0a 2a 2a 0a 2a 2a 20 50 72 65  EWUSER.**.** Pre
7cd0: 73 65 6e 74 20 61 20 64 69 61 6c 6f 67 20 66 6f  sent a dialog fo
7ce0: 72 20 75 70 64 61 74 69 6e 67 20 70 72 6f 70 65  r updating prope
7cf0: 72 74 69 65 73 20 6f 66 20 61 20 62 61 73 65 6c  rties of a basel
7d00: 69 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ine:.**.**     *
7d10: 20 20 54 68 65 20 63 68 65 63 6b 2d 69 6e 20 75    The check-in u
7d20: 73 65 72 0a 2a 2a 20 20 20 20 20 2a 20 20 54 68  ser.**     *  Th
7d30: 65 20 63 68 65 63 6b 2d 69 6e 20 63 6f 6d 6d 65  e check-in comme
7d40: 6e 74 0a 2a 2a 20 20 20 20 20 2a 20 20 54 68 65  nt.**     *  The
7d50: 20 62 61 63 6b 67 72 6f 75 6e 64 20 63 6f 6c 6f   background colo
7d60: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 63 69 5f 65 64  r..*/.void ci_ed
7d70: 69 74 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20  it_page(void){. 
7d80: 20 69 6e 74 20 72 69 64 3b 0a 20 20 63 6f 6e 73   int rid;.  cons
7d90: 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 65 6e 74  t char *zComment
7da0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72  ;         /* Cur
7db0: 72 65 6e 74 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20  rent comment on 
7dc0: 74 68 65 20 63 68 65 63 6b 2d 69 6e 20 2a 2f 0a  the check-in */.
7dd0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
7de0: 65 77 43 6f 6d 6d 65 6e 74 3b 20 20 20 20 20 20  ewComment;      
7df0: 2f 2a 20 52 65 76 69 73 65 64 20 63 68 65 63 6b  /* Revised check
7e00: 2d 69 6e 20 63 6f 6d 6d 65 6e 74 20 2a 2f 0a 20  -in comment */. 
7e10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73   const char *zUs
7e20: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  er;            /
7e30: 2a 20 43 75 72 72 65 6e 74 20 75 73 65 72 20 66  * Current user f
7e40: 6f 72 20 74 68 65 20 63 68 65 63 6b 2d 69 6e 20  or the check-in 
7e50: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
7e60: 2a 7a 4e 65 77 55 73 65 72 3b 20 20 20 20 20 20  *zNewUser;      
7e70: 20 20 20 2f 2a 20 52 65 76 69 73 65 64 20 75 73     /* Revised us
7e80: 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  er */.  const ch
7e90: 61 72 20 2a 7a 44 61 74 65 3b 20 20 20 20 20 20  ar *zDate;      
7ea0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
7eb0: 20 64 61 74 65 20 6f 66 20 74 68 65 20 63 68 65   date of the che
7ec0: 63 6b 2d 69 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ck-in */.  const
7ed0: 20 63 68 61 72 20 2a 7a 4e 65 77 44 61 74 65 3b   char *zNewDate;
7ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 76 69           /* Revi
7ef0: 73 65 64 20 63 68 65 63 6b 2d 69 6e 20 64 61 74  sed check-in dat
7f00: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
7f10: 72 20 2a 7a 43 6f 6c 6f 72 3b 20 20 20 20 20 20  r *zColor;      
7f20: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
7f30: 7a 4e 65 77 43 6f 6c 6f 72 3b 0a 20 20 63 6f 6e  zNewColor;.  con
7f40: 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 54 61 67  st char *zNewTag
7f50: 46 6c 61 67 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Flag;.  const ch
7f60: 61 72 20 2a 7a 4e 65 77 54 61 67 3b 0a 20 20 63  ar *zNewTag;.  c
7f70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 42  onst char *zNewB
7f80: 72 46 6c 61 67 3b 0a 20 20 63 6f 6e 73 74 20 63  rFlag;.  const c
7f90: 68 61 72 20 2a 7a 4e 65 77 42 72 61 6e 63 68 3b  har *zNewBranch;
7fa0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7fb0: 43 6c 6f 73 65 46 6c 61 67 3b 0a 20 20 69 6e 74  CloseFlag;.  int
7fc0: 20 66 50 72 6f 70 61 67 61 74 65 43 6f 6c 6f 72   fPropagateColor
7fd0: 3b 0a 20 20 63 68 61 72 20 2a 7a 55 75 69 64 3b  ;.  char *zUuid;
7fe0: 0a 20 20 42 6c 6f 62 20 63 6f 6d 6d 65 6e 74 3b  .  Blob comment;
7ff0: 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 73 74 61  .  Stmt q;.  sta
8000: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
8010: 20 53 61 6d 70 6c 65 43 6f 6c 6f 72 73 20 7b 0a   SampleColors {.
8020: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
8030: 2a 7a 43 4e 61 6d 65 3b 0a 20 20 20 20 20 63 6f  *zCName;.     co
8040: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6f 72  nst char *zColor
8050: 3b 0a 20 20 7d 20 61 43 6f 6c 6f 72 5b 5d 20 3d  ;.  } aColor[] =
8060: 20 7b 0a 20 20 20 20 20 7b 20 22 28 6e 6f 6e 65   {.     { "(none
8070: 29 22 2c 20 20 22 22 20 7d 2c 0a 20 20 20 20 20  )",  "" },.     
8080: 7b 20 22 23 66 32 64 63 64 63 22 2c 20 22 23 66  { "#f2dcdc", "#f
8090: 32 64 63 64 63 22 20 7d 2c 0a 20 20 20 20 20 7b  2dcdc" },.     {
80a0: 20 22 23 66 30 66 66 63 30 22 2c 20 22 23 66 30   "#f0ffc0", "#f0
80b0: 66 66 63 30 22 20 7d 2c 0a 20 20 20 20 20 7b 20  ffc0" },.     { 
80c0: 22 23 62 64 65 35 64 36 22 2c 20 22 23 62 64 65  "#bde5d6", "#bde
80d0: 35 64 36 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22  5d6" },.     { "
80e0: 23 63 30 66 66 63 30 22 2c 20 22 23 63 30 66 66  #c0ffc0", "#c0ff
80f0: 63 30 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 23  c0" },.     { "#
8100: 63 30 66 66 66 30 22 2c 20 22 23 63 30 66 66 66  c0fff0", "#c0fff
8110: 30 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 23 63  0" },.     { "#c
8120: 30 66 30 66 66 22 2c 20 22 23 63 30 66 30 66 66  0f0ff", "#c0f0ff
8130: 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 23 64 30  " },.     { "#d0
8140: 63 30 66 66 22 2c 20 22 23 64 30 63 30 66 66 22  c0ff", "#d0c0ff"
8150: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 23 66 66 63   },.     { "#ffc
8160: 30 66 66 22 2c 20 22 23 66 66 63 30 66 66 22 20  0ff", "#ffc0ff" 
8170: 7d 2c 0a 20 20 20 20 20 7b 20 22 23 66 66 63 30  },.     { "#ffc0
8180: 64 30 22 2c 20 22 23 66 66 63 30 64 30 22 20 7d  d0", "#ffc0d0" }
8190: 2c 0a 20 20 20 20 20 7b 20 22 23 66 66 66 30 63  ,.     { "#fff0c
81a0: 30 22 2c 20 22 23 66 66 66 30 63 30 22 20 7d 2c  0", "#fff0c0" },
81b0: 0a 20 20 20 20 20 7b 20 22 23 63 30 63 30 63 30  .     { "#c0c0c0
81c0: 22 2c 20 22 23 63 30 63 30 63 30 22 20 7d 2c 0a  ", "#c0c0c0" },.
81d0: 20 20 7d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 6f    };.  int nColo
81e0: 72 20 3d 20 73 69 7a 65 6f 66 28 61 43 6f 6c 6f  r = sizeof(aColo
81f0: 72 29 2f 73 69 7a 65 6f 66 28 61 43 6f 6c 6f 72  r)/sizeof(aColor
8200: 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  [0]);.  int i;. 
8210: 20 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f   .  login_check_
8220: 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20  credentials();. 
8230: 20 69 66 28 20 21 67 2e 6f 6b 57 72 69 74 65 20   if( !g.okWrite 
8240: 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28  ){ login_needed(
8250: 29 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 72  ); return; }.  r
8260: 69 64 20 3d 20 61 74 6f 69 28 50 44 28 22 72 22  id = atoi(PD("r"
8270: 2c 22 30 22 29 29 3b 0a 20 20 7a 55 75 69 64 20  ,"0"));.  zUuid 
8280: 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45  = db_text(0, "SE
8290: 4c 45 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62  LECT uuid FROM b
82a0: 6c 6f 62 20 57 48 45 52 45 20 72 69 64 3d 25 64  lob WHERE rid=%d
82b0: 22 2c 20 72 69 64 29 3b 0a 20 20 7a 43 6f 6d 6d  ", rid);.  zComm
82c0: 65 6e 74 20 3d 20 64 62 5f 74 65 78 74 28 30 2c  ent = db_text(0,
82d0: 20 22 53 45 4c 45 43 54 20 63 6f 61 6c 65 73 63   "SELECT coalesc
82e0: 65 28 65 63 6f 6d 6d 65 6e 74 2c 63 6f 6d 6d 65  e(ecomment,comme
82f0: 6e 74 29 22 0a 20 20 20 20 20 20 20 20 20 20 20  nt)".           
8300: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
8310: 46 52 4f 4d 20 65 76 65 6e 74 20 57 48 45 52 45  FROM event WHERE
8320: 20 6f 62 6a 69 64 3d 25 64 22 2c 20 72 69 64 29   objid=%d", rid)
8330: 3b 0a 20 20 69 66 28 20 7a 43 6f 6d 6d 65 6e 74  ;.  if( zComment
8340: 3d 3d 30 20 29 20 66 6f 73 73 69 6c 5f 72 65 64  ==0 ) fossil_red
8350: 69 72 65 63 74 5f 68 6f 6d 65 28 29 3b 0a 20 20  irect_home();.  
8360: 69 66 28 20 50 28 22 63 61 6e 63 65 6c 22 29 20  if( P("cancel") 
8370: 29 7b 0a 20 20 20 20 63 67 69 5f 72 65 64 69 72  ){.    cgi_redir
8380: 65 63 74 66 28 22 63 69 3f 6e 61 6d 65 3d 25 64  ectf("ci?name=%d
8390: 22 2c 20 72 69 64 29 3b 0a 20 20 7d 0a 20 20 7a  ", rid);.  }.  z
83a0: 4e 65 77 43 6f 6d 6d 65 6e 74 20 3d 20 50 44 28  NewComment = PD(
83b0: 22 63 22 2c 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  "c",zComment);. 
83c0: 20 7a 55 73 65 72 20 3d 20 64 62 5f 74 65 78 74   zUser = db_text
83d0: 28 30 2c 20 22 53 45 4c 45 43 54 20 63 6f 61 6c  (0, "SELECT coal
83e0: 65 73 63 65 28 65 75 73 65 72 2c 75 73 65 72 29  esce(euser,user)
83f0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
8400: 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20 65         "  FROM e
8410: 76 65 6e 74 20 57 48 45 52 45 20 6f 62 6a 69 64  vent WHERE objid
8420: 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 69 66  =%d", rid);.  if
8430: 28 20 7a 55 73 65 72 3d 3d 30 20 29 20 66 6f 73  ( zUser==0 ) fos
8440: 73 69 6c 5f 72 65 64 69 72 65 63 74 5f 68 6f 6d  sil_redirect_hom
8450: 65 28 29 3b 0a 20 20 7a 4e 65 77 55 73 65 72 20  e();.  zNewUser 
8460: 3d 20 50 44 28 22 75 22 2c 7a 55 73 65 72 29 3b  = PD("u",zUser);
8470: 0a 20 20 7a 44 61 74 65 20 3d 20 64 62 5f 74 65  .  zDate = db_te
8480: 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 64 61  xt(0, "SELECT da
8490: 74 65 74 69 6d 65 28 6d 74 69 6d 65 29 22 0a 20  tetime(mtime)". 
84a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84b0: 20 20 20 20 22 20 20 46 52 4f 4d 20 65 76 65 6e      "  FROM even
84c0: 74 20 57 48 45 52 45 20 6f 62 6a 69 64 3d 25 64  t WHERE objid=%d
84d0: 22 2c 20 72 69 64 29 3b 0a 20 20 69 66 28 20 7a  ", rid);.  if( z
84e0: 44 61 74 65 3d 3d 30 20 29 20 66 6f 73 73 69 6c  Date==0 ) fossil
84f0: 5f 72 65 64 69 72 65 63 74 5f 68 6f 6d 65 28 29  _redirect_home()
8500: 3b 0a 20 20 7a 4e 65 77 44 61 74 65 20 3d 20 50  ;.  zNewDate = P
8510: 44 28 22 64 74 22 2c 7a 44 61 74 65 29 3b 0a 20  D("dt",zDate);. 
8520: 20 7a 43 6f 6c 6f 72 20 3d 20 64 62 5f 74 65 78   zColor = db_tex
8530: 74 28 22 22 2c 20 22 53 45 4c 45 43 54 20 62 67  t("", "SELECT bg
8540: 63 6f 6c 6f 72 22 0a 20 20 20 20 20 20 20 20 20  color".         
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
8560: 20 20 46 52 4f 4d 20 65 76 65 6e 74 20 57 48 45    FROM event WHE
8570: 52 45 20 6f 62 6a 69 64 3d 25 64 22 2c 20 72 69  RE objid=%d", ri
8580: 64 29 3b 0a 20 20 7a 4e 65 77 43 6f 6c 6f 72 20  d);.  zNewColor 
8590: 3d 20 50 44 28 22 63 6c 72 22 2c 7a 43 6f 6c 6f  = PD("clr",zColo
85a0: 72 29 3b 0a 20 20 66 50 72 6f 70 61 67 61 74 65  r);.  fPropagate
85b0: 43 6f 6c 6f 72 20 3d 20 50 28 22 70 63 6c 72 22  Color = P("pclr"
85c0: 29 21 3d 30 3b 0a 20 20 7a 4e 65 77 54 61 67 46  )!=0;.  zNewTagF
85d0: 6c 61 67 20 3d 20 50 28 22 6e 65 77 74 61 67 22  lag = P("newtag"
85e0: 29 20 3f 20 22 20 63 68 65 63 6b 65 64 22 20 3a  ) ? " checked" :
85f0: 20 22 22 3b 0a 20 20 7a 4e 65 77 54 61 67 20 3d   "";.  zNewTag =
8600: 20 50 44 28 22 74 61 67 6e 61 6d 65 22 2c 22 22   PD("tagname",""
8610: 29 3b 0a 20 20 7a 4e 65 77 42 72 46 6c 61 67 20  );.  zNewBrFlag 
8620: 3d 20 50 28 22 6e 65 77 62 72 22 29 20 3f 20 22  = P("newbr") ? "
8630: 20 63 68 65 63 6b 65 64 22 20 3a 20 22 22 3b 0a   checked" : "";.
8640: 20 20 7a 4e 65 77 42 72 61 6e 63 68 20 3d 20 50    zNewBranch = P
8650: 44 28 22 62 72 6e 61 6d 65 22 2c 22 22 29 3b 0a  D("brname","");.
8660: 20 20 7a 43 6c 6f 73 65 46 6c 61 67 20 3d 20 50    zCloseFlag = P
8670: 28 22 63 6c 6f 73 65 22 29 20 3f 20 22 20 63 68  ("close") ? " ch
8680: 65 63 6b 65 64 22 20 3a 20 22 22 3b 0a 20 20 69  ecked" : "";.  i
8690: 66 28 20 50 28 22 61 70 70 6c 79 22 29 20 29 7b  f( P("apply") ){
86a0: 0a 20 20 20 20 42 6c 6f 62 20 63 74 72 6c 3b 0a  .    Blob ctrl;.
86b0: 20 20 20 20 63 68 61 72 20 2a 7a 44 61 74 65 3b      char *zDate;
86c0: 0a 20 20 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d  .    int nChng =
86d0: 20 30 3b 0a 0a 20 20 20 20 6c 6f 67 69 6e 5f 76   0;..    login_v
86e0: 65 72 69 66 79 5f 63 73 72 66 5f 73 65 63 72 65  erify_csrf_secre
86f0: 74 28 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65  t();.    blob_ze
8700: 72 6f 28 26 63 74 72 6c 29 3b 0a 20 20 20 20 7a  ro(&ctrl);.    z
8710: 44 61 74 65 20 3d 20 64 62 5f 74 65 78 74 28 30  Date = db_text(0
8720: 2c 20 22 53 45 4c 45 43 54 20 64 61 74 65 74 69  , "SELECT dateti
8730: 6d 65 28 27 6e 6f 77 27 29 22 29 3b 0a 20 20 20  me('now')");.   
8740: 20 7a 44 61 74 65 5b 31 30 5d 20 3d 20 27 54 27   zDate[10] = 'T'
8750: 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e  ;.    blob_appen
8760: 64 66 28 26 63 74 72 6c 2c 20 22 44 20 25 73 5c  df(&ctrl, "D %s\
8770: 6e 22 2c 20 7a 44 61 74 65 29 3b 0a 20 20 20 20  n", zDate);.    
8780: 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 43  db_multi_exec("C
8790: 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45  REATE TEMP TABLE
87a0: 20 6e 65 77 74 61 67 73 28 74 61 67 20 55 4e 49   newtags(tag UNI
87b0: 51 55 45 2c 20 70 72 65 66 69 78 2c 20 76 61 6c  QUE, prefix, val
87c0: 75 65 29 22 29 3b 0a 20 20 20 20 69 66 28 20 7a  ue)");.    if( z
87d0: 4e 65 77 43 6f 6c 6f 72 5b 30 5d 20 26 26 20 73  NewColor[0] && s
87e0: 74 72 63 6d 70 28 7a 43 6f 6c 6f 72 2c 7a 4e 65  trcmp(zColor,zNe
87f0: 77 43 6f 6c 6f 72 29 21 3d 30 20 29 7b 0a 20 20  wColor)!=0 ){.  
8800: 20 20 20 20 63 68 61 72 20 2a 7a 50 72 65 66 69      char *zPrefi
8810: 78 20 3d 20 22 2b 22 3b 0a 20 20 20 20 20 20 69  x = "+";.      i
8820: 66 28 20 66 50 72 6f 70 61 67 61 74 65 43 6f 6c  f( fPropagateCol
8830: 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  or ){.        zP
8840: 72 65 66 69 78 20 3d 20 22 2a 22 3b 0a 20 20 20  refix = "*";.   
8850: 20 20 20 7d 0a 20 20 20 20 20 20 64 62 5f 6d 75     }.      db_mu
8860: 6c 74 69 5f 65 78 65 63 28 22 52 45 50 4c 41 43  lti_exec("REPLAC
8870: 45 20 49 4e 54 4f 20 6e 65 77 74 61 67 73 20 56  E INTO newtags V
8880: 41 4c 55 45 53 28 27 62 67 63 6f 6c 6f 72 27 2c  ALUES('bgcolor',
8890: 25 51 2c 25 51 29 22 2c 0a 20 20 20 20 20 20 20  %Q,%Q)",.       
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 50 72               zPr
88b0: 65 66 69 78 2c 20 7a 4e 65 77 43 6f 6c 6f 72 29  efix, zNewColor)
88c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
88d0: 7a 4e 65 77 43 6f 6c 6f 72 5b 30 5d 3d 3d 30 20  zNewColor[0]==0 
88e0: 26 26 20 7a 43 6f 6c 6f 72 5b 30 5d 21 3d 30 20  && zColor[0]!=0 
88f0: 29 7b 0a 20 20 20 20 20 20 64 62 5f 6d 75 6c 74  ){.      db_mult
8900: 69 5f 65 78 65 63 28 22 52 45 50 4c 41 43 45 20  i_exec("REPLACE 
8910: 49 4e 54 4f 20 6e 65 77 74 61 67 73 20 56 41 4c  INTO newtags VAL
8920: 55 45 53 28 27 62 67 63 6f 6c 6f 72 27 2c 27 2d  UES('bgcolor','-
8930: 27 2c 4e 55 4c 4c 29 22 29 3b 0a 20 20 20 20 7d  ',NULL)");.    }
8940: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
8950: 7a 43 6f 6d 6d 65 6e 74 2c 7a 4e 65 77 43 6f 6d  zComment,zNewCom
8960: 6d 65 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  ment)!=0 ){.    
8970: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
8980: 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 6e 65  "REPLACE INTO ne
8990: 77 74 61 67 73 20 56 41 4c 55 45 53 28 27 63 6f  wtags VALUES('co
89a0: 6d 6d 65 6e 74 27 2c 27 2b 27 2c 25 51 29 22 2c  mment','+',%Q)",
89b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
89c0: 20 20 20 20 20 7a 4e 65 77 43 6f 6d 6d 65 6e 74       zNewComment
89d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
89e0: 20 73 74 72 63 6d 70 28 7a 44 61 74 65 2c 7a 4e   strcmp(zDate,zN
89f0: 65 77 44 61 74 65 29 21 3d 30 20 29 7b 0a 20 20  ewDate)!=0 ){.  
8a00: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65      db_multi_exe
8a10: 63 28 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20  c("REPLACE INTO 
8a20: 6e 65 77 74 61 67 73 20 56 41 4c 55 45 53 28 27  newtags VALUES('
8a30: 64 61 74 65 27 2c 27 2b 27 2c 25 51 29 22 2c 0a  date','+',%Q)",.
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a50: 20 20 20 20 7a 4e 65 77 44 61 74 65 29 3b 0a 20      zNewDate);. 
8a60: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
8a70: 63 6d 70 28 7a 55 73 65 72 2c 7a 4e 65 77 55 73  cmp(zUser,zNewUs
8a80: 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  er)!=0 ){.      
8a90: 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 52  db_multi_exec("R
8aa0: 45 50 4c 41 43 45 20 49 4e 54 4f 20 6e 65 77 74  EPLACE INTO newt
8ab0: 61 67 73 20 56 41 4c 55 45 53 28 27 75 73 65 72  ags VALUES('user
8ac0: 27 2c 27 2b 27 2c 25 51 29 22 2c 20 7a 4e 65 77  ','+',%Q)", zNew
8ad0: 55 73 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  User);.    }.   
8ae0: 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 0a   db_prepare(&q,.
8af0: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 74         "SELECT t
8b00: 61 67 2e 74 61 67 69 64 2c 20 74 61 67 6e 61 6d  ag.tagid, tagnam
8b10: 65 20 46 52 4f 4d 20 74 61 67 78 72 65 66 2c 20  e FROM tagxref, 
8b20: 74 61 67 22 0a 20 20 20 20 20 20 20 22 20 57 48  tag".       " WH
8b30: 45 52 45 20 74 61 67 78 72 65 66 2e 72 69 64 3d  ERE tagxref.rid=
8b40: 25 64 20 41 4e 44 20 74 61 67 74 79 70 65 3e 30  %d AND tagtype>0
8b50: 20 41 4e 44 20 74 61 67 78 72 65 66 2e 74 61 67   AND tagxref.tag
8b60: 69 64 3d 74 61 67 2e 74 61 67 69 64 22 2c 0a 20  id=tag.tagid",. 
8b70: 20 20 20 20 20 20 72 69 64 0a 20 20 20 20 29 3b        rid.    );
8b80: 0a 20 20 20 20 77 68 69 6c 65 28 20 64 62 5f 73  .    while( db_s
8b90: 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f  tep(&q)==SQLITE_
8ba0: 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ROW ){.      int
8bb0: 20 74 61 67 69 64 20 3d 20 64 62 5f 63 6f 6c 75   tagid = db_colu
8bc0: 6d 6e 5f 69 6e 74 28 26 71 2c 20 30 29 3b 0a 20  mn_int(&q, 0);. 
8bd0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
8be0: 2a 7a 54 61 67 20 3d 20 64 62 5f 63 6f 6c 75 6d  *zTag = db_colum
8bf0: 6e 5f 74 65 78 74 28 26 71 2c 20 31 29 3b 0a 20  n_text(&q, 1);. 
8c00: 20 20 20 20 20 63 68 61 72 20 7a 4c 61 62 65 6c       char zLabel
8c10: 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73 70 72 69  [30];.      spri
8c20: 6e 74 66 28 7a 4c 61 62 65 6c 2c 20 22 63 25 64  ntf(zLabel, "c%d
8c30: 22 2c 20 74 61 67 69 64 29 3b 0a 20 20 20 20 20  ", tagid);.     
8c40: 20 69 66 28 20 50 28 7a 4c 61 62 65 6c 29 20 29   if( P(zLabel) )
8c50: 7b 0a 20 20 20 20 20 20 20 20 64 62 5f 6d 75 6c  {.        db_mul
8c60: 74 69 5f 65 78 65 63 28 22 52 45 50 4c 41 43 45  ti_exec("REPLACE
8c70: 20 49 4e 54 4f 20 6e 65 77 74 61 67 73 20 56 41   INTO newtags VA
8c80: 4c 55 45 53 28 25 51 2c 27 2d 27 2c 4e 55 4c 4c  LUES(%Q,'-',NULL
8c90: 29 22 2c 20 7a 54 61 67 29 3b 0a 20 20 20 20 20  )", zTag);.     
8ca0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 5f   }.    }.    db_
8cb0: 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20  finalize(&q);.  
8cc0: 20 20 69 66 28 20 7a 43 6c 6f 73 65 46 6c 61 67    if( zCloseFlag
8cd0: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 64 62 5f  [0] ){.      db_
8ce0: 6d 75 6c 74 69 5f 65 78 65 63 28 22 52 45 50 4c  multi_exec("REPL
8cf0: 41 43 45 20 49 4e 54 4f 20 6e 65 77 74 61 67 73  ACE INTO newtags
8d00: 20 56 41 4c 55 45 53 28 27 63 6c 6f 73 65 64 27   VALUES('closed'
8d10: 2c 27 2b 27 2c 4e 55 4c 4c 29 22 29 3b 0a 20 20  ,'+',NULL)");.  
8d20: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4e 65 77    }.    if( zNew
8d30: 54 61 67 46 6c 61 67 5b 30 5d 20 29 7b 0a 20 20  TagFlag[0] ){.  
8d40: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65      db_multi_exe
8d50: 63 28 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20  c("REPLACE INTO 
8d60: 6e 65 77 74 61 67 73 20 56 41 4c 55 45 53 28 27  newtags VALUES('
8d70: 73 79 6d 2d 25 71 27 2c 27 2b 27 2c 4e 55 4c 4c  sym-%q','+',NULL
8d80: 29 22 2c 20 7a 4e 65 77 54 61 67 29 3b 0a 20 20  )", zNewTag);.  
8d90: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4e 65 77    }.    if( zNew
8da0: 42 72 46 6c 61 67 5b 30 5d 20 29 7b 0a 20 20 20  BrFlag[0] ){.   
8db0: 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63     db_multi_exec
8dc0: 28 0a 20 20 20 20 20 20 20 20 22 52 45 50 4c 41  (.        "REPLA
8dd0: 43 45 20 49 4e 54 4f 20 6e 65 77 74 61 67 73 20  CE INTO newtags 
8de0: 22 0a 20 20 20 20 20 20 20 20 22 20 53 45 4c 45  ".        " SELE
8df0: 43 54 20 74 61 67 6e 61 6d 65 2c 20 27 2d 27 2c  CT tagname, '-',
8e00: 20 4e 55 4c 4c 20 46 52 4f 4d 20 74 61 67 78 72   NULL FROM tagxr
8e10: 65 66 2c 20 74 61 67 22 0a 20 20 20 20 20 20 20  ef, tag".       
8e20: 20 22 20 20 57 48 45 52 45 20 74 61 67 78 72 65   "  WHERE tagxre
8e30: 66 2e 72 69 64 3d 25 64 20 41 4e 44 20 74 61 67  f.rid=%d AND tag
8e40: 74 79 70 65 3d 3d 32 22 0a 20 20 20 20 20 20 20  type==2".       
8e50: 20 22 20 20 20 20 41 4e 44 20 74 61 67 6e 61 6d   "    AND tagnam
8e60: 65 20 47 4c 4f 42 20 27 73 79 6d 2d 2a 27 22 0a  e GLOB 'sym-*'".
8e70: 20 20 20 20 20 20 20 20 22 20 20 20 20 41 4e 44          "    AND
8e80: 20 74 61 67 2e 74 61 67 69 64 3d 74 61 67 78 72   tag.tagid=tagxr
8e90: 65 66 2e 74 61 67 69 64 22 2c 0a 20 20 20 20 20  ef.tagid",.     
8ea0: 20 20 20 72 69 64 0a 20 20 20 20 20 20 29 3b 0a     rid.      );.
8eb0: 20 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65        db_multi_e
8ec0: 78 65 63 28 22 52 45 50 4c 41 43 45 20 49 4e 54  xec("REPLACE INT
8ed0: 4f 20 6e 65 77 74 61 67 73 20 56 41 4c 55 45 53  O newtags VALUES
8ee0: 28 27 62 72 61 6e 63 68 27 2c 27 2a 27 2c 25 51  ('branch','*',%Q
8ef0: 29 22 2c 20 7a 4e 65 77 42 72 61 6e 63 68 29 3b  )", zNewBranch);
8f00: 0a 20 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f  .      db_multi_
8f10: 65 78 65 63 28 22 52 45 50 4c 41 43 45 20 49 4e  exec("REPLACE IN
8f20: 54 4f 20 6e 65 77 74 61 67 73 20 56 41 4c 55 45  TO newtags VALUE
8f30: 53 28 27 73 79 6d 2d 25 71 27 2c 27 2a 27 2c 4e  S('sym-%q','*',N
8f40: 55 4c 4c 29 22 2c 0a 20 20 20 20 20 20 20 20 20  ULL)",.         
8f50: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 65 77 42             zNewB
8f60: 72 61 6e 63 68 29 3b 0a 20 20 20 20 7d 0a 20 20  ranch);.    }.  
8f70: 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c    db_prepare(&q,
8f80: 20 22 53 45 4c 45 43 54 20 74 61 67 2c 20 70 72   "SELECT tag, pr
8f90: 65 66 69 78 2c 20 76 61 6c 75 65 20 46 52 4f 4d  efix, value FROM
8fa0: 20 6e 65 77 74 61 67 73 22 0a 20 20 20 20 20 20   newtags".      
8fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f               " O
8fc0: 52 44 45 52 20 42 59 20 70 72 65 66 69 78 20 7c  RDER BY prefix |
8fd0: 7c 20 74 61 67 22 29 3b 0a 20 20 20 20 77 68 69  | tag");.    whi
8fe0: 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d  le( db_step(&q)=
8ff0: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
9000: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
9010: 2a 7a 54 61 67 20 3d 20 64 62 5f 63 6f 6c 75 6d  *zTag = db_colum
9020: 6e 5f 74 65 78 74 28 26 71 2c 20 30 29 3b 0a 20  n_text(&q, 0);. 
9030: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
9040: 2a 7a 50 72 65 66 69 78 20 3d 20 64 62 5f 63 6f  *zPrefix = db_co
9050: 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31 29  lumn_text(&q, 1)
9060: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
9070: 61 72 20 2a 7a 56 61 6c 75 65 20 3d 20 64 62 5f  ar *zValue = db_
9080: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
9090: 32 29 3b 0a 20 20 20 20 20 20 6e 43 68 6e 67 2b  2);.      nChng+
90a0: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 56 61  +;.      if( zVa
90b0: 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 62  lue ){.        b
90c0: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 63 74 72  lob_appendf(&ctr
90d0: 6c 2c 20 22 54 20 25 73 25 46 20 25 73 20 25 46  l, "T %s%F %s %F
90e0: 5c 6e 22 2c 20 7a 50 72 65 66 69 78 2c 20 7a 54  \n", zPrefix, zT
90f0: 61 67 2c 20 7a 55 75 69 64 2c 20 7a 56 61 6c 75  ag, zUuid, zValu
9100: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
9110: 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70  .        blob_ap
9120: 70 65 6e 64 66 28 26 63 74 72 6c 2c 20 22 54 20  pendf(&ctrl, "T 
9130: 25 73 25 46 20 25 73 5c 6e 22 2c 20 7a 50 72 65  %s%F %s\n", zPre
9140: 66 69 78 2c 20 7a 54 61 67 2c 20 7a 55 75 69 64  fix, zTag, zUuid
9150: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9160: 0a 20 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65  .    db_finalize
9170: 28 26 71 29 3b 0a 20 20 20 20 69 66 28 20 6e 43  (&q);.    if( nC
9180: 68 6e 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  hng>0 ){.      i
9190: 6e 74 20 6e 72 69 64 3b 0a 20 20 20 20 20 20 42  nt nrid;.      B
91a0: 6c 6f 62 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20  lob cksum;.     
91b0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 63   blob_appendf(&c
91c0: 74 72 6c 2c 20 22 55 20 25 46 5c 6e 22 2c 20 67  trl, "U %F\n", g
91d0: 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 20 20 20 20 20  .zLogin);.      
91e0: 6d 64 35 73 75 6d 5f 62 6c 6f 62 28 26 63 74 72  md5sum_blob(&ctr
91f0: 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20  l, &cksum);.    
9200: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26    blob_appendf(&
9210: 63 74 72 6c 2c 20 22 5a 20 25 62 5c 6e 22 2c 20  ctrl, "Z %b\n", 
9220: 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 64  &cksum);.      d
9230: 62 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  b_begin_transact
9240: 69 6f 6e 28 29 3b 0a 20 20 20 20 20 20 67 2e 6d  ion();.      g.m
9250: 61 72 6b 50 72 69 76 61 74 65 20 3d 20 63 6f 6e  arkPrivate = con
9260: 74 65 6e 74 5f 69 73 5f 70 72 69 76 61 74 65 28  tent_is_private(
9270: 72 69 64 29 3b 0a 20 20 20 20 20 20 6e 72 69 64  rid);.      nrid
9280: 20 3d 20 63 6f 6e 74 65 6e 74 5f 70 75 74 28 26   = content_put(&
9290: 63 74 72 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ctrl, 0, 0);.   
92a0: 20 20 20 6d 61 6e 69 66 65 73 74 5f 63 72 6f 73     manifest_cros
92b0: 73 6c 69 6e 6b 28 6e 72 69 64 2c 20 26 63 74 72  slink(nrid, &ctr
92c0: 6c 29 3b 0a 20 20 20 20 20 20 64 62 5f 65 6e 64  l);.      db_end
92d0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 30 29 3b  _transaction(0);
92e0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 67 69 5f 72  .    }.    cgi_r
92f0: 65 64 69 72 65 63 74 66 28 22 63 69 3f 6e 61 6d  edirectf("ci?nam
9300: 65 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 7d  e=%d", rid);.  }
9310: 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 63 6f  .  blob_zero(&co
9320: 6d 6d 65 6e 74 29 3b 0a 20 20 62 6c 6f 62 5f 61  mment);.  blob_a
9330: 70 70 65 6e 64 28 26 63 6f 6d 6d 65 6e 74 2c 20  ppend(&comment, 
9340: 7a 4e 65 77 43 6f 6d 6d 65 6e 74 2c 20 2d 31 29  zNewComment, -1)
9350: 3b 0a 20 20 7a 55 75 69 64 5b 31 30 5d 20 3d 20  ;.  zUuid[10] = 
9360: 30 3b 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65  0;.  style_heade
9370: 72 28 22 45 64 69 74 20 43 68 65 63 6b 2d 69 6e  r("Edit Check-in
9380: 20 5b 25 73 5d 22 2c 20 7a 55 75 69 64 29 3b 0a   [%s]", zUuid);.
9390: 20 20 69 66 28 20 50 28 22 70 72 65 76 69 65 77    if( P("preview
93a0: 22 29 20 29 7b 0a 20 20 20 20 42 6c 6f 62 20 73  ") ){.    Blob s
93b0: 75 66 66 69 78 3b 0a 20 20 20 20 69 6e 74 20 6e  uffix;.    int n
93c0: 54 61 67 20 3d 20 30 3b 0a 20 20 20 20 40 20 3c  Tag = 0;.    @ <
93d0: 62 3e 50 72 65 76 69 65 77 3a 3c 2f 62 3e 0a 20  b>Preview:</b>. 
93e0: 20 20 20 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65     @ <blockquote
93f0: 3e 0a 20 20 20 20 40 20 3c 74 61 62 6c 65 20 62  >.    @ <table b
9400: 6f 72 64 65 72 3d 30 3e 0a 20 20 20 20 69 66 28  order=0>.    if(
9410: 20 7a 4e 65 77 43 6f 6c 6f 72 20 26 26 20 7a 4e   zNewColor && zN
9420: 65 77 43 6f 6c 6f 72 5b 30 5d 20 29 7b 0a 20 20  ewColor[0] ){.  
9430: 20 20 20 20 40 20 3c 74 72 3e 3c 74 64 20 62 67      @ <tr><td bg
9440: 63 6f 6c 6f 72 3d 22 25 68 28 7a 4e 65 77 43 6f  color="%h(zNewCo
9450: 6c 6f 72 29 22 3e 0a 20 20 20 20 7d 65 6c 73 65  lor)">.    }else
9460: 7b 0a 20 20 20 20 20 20 40 20 3c 74 72 3e 3c 74  {.      @ <tr><t
9470: 64 3e 0a 20 20 20 20 7d 0a 20 20 20 20 77 69 6b  d>.    }.    wik
9480: 69 5f 63 6f 6e 76 65 72 74 28 26 63 6f 6d 6d 65  i_convert(&comme
9490: 6e 74 2c 20 30 2c 20 57 49 4b 49 5f 49 4e 4c 49  nt, 0, WIKI_INLI
94a0: 4e 45 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65  NE);.    blob_ze
94b0: 72 6f 28 26 73 75 66 66 69 78 29 3b 0a 20 20 20  ro(&suffix);.   
94c0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 73   blob_appendf(&s
94d0: 75 66 66 69 78 2c 20 22 28 75 73 65 72 3a 20 25  uffix, "(user: %
94e0: 68 22 2c 20 7a 4e 65 77 55 73 65 72 29 3b 0a 20  h", zNewUser);. 
94f0: 20 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71     db_prepare(&q
9500: 2c 20 22 53 45 4c 45 43 54 20 73 75 62 73 74 72  , "SELECT substr
9510: 28 74 61 67 6e 61 6d 65 2c 35 29 20 46 52 4f 4d  (tagname,5) FROM
9520: 20 74 61 67 78 72 65 66 2c 20 74 61 67 22 0a 20   tagxref, tag". 
9530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9540: 20 20 22 20 57 48 45 52 45 20 74 61 67 6e 61 6d    " WHERE tagnam
9550: 65 20 47 4c 4f 42 20 27 73 79 6d 2d 2a 27 20 41  e GLOB 'sym-*' A
9560: 4e 44 20 74 61 67 78 72 65 66 2e 72 69 64 3d 25  ND tagxref.rid=%
9570: 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d".             
9580: 20 20 20 20 20 20 22 20 20 20 41 4e 44 20 74 61        "   AND ta
9590: 67 74 79 70 65 3e 31 20 41 4e 44 20 74 61 67 2e  gtype>1 AND tag.
95a0: 74 61 67 69 64 3d 74 61 67 78 72 65 66 2e 74 61  tagid=tagxref.ta
95b0: 67 69 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20  gid",.          
95c0: 20 20 20 20 20 20 20 20 20 72 69 64 29 3b 0a 20           rid);. 
95d0: 20 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65     while( db_ste
95e0: 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  p(&q)==SQLITE_RO
95f0: 57 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  W ){.      const
9600: 20 63 68 61 72 20 2a 7a 54 61 67 20 3d 20 64 62   char *zTag = db
9610: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c  _column_text(&q,
9620: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e   0);.      if( n
9630: 54 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tag==0 ){.      
9640: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26    blob_appendf(&
9650: 73 75 66 66 69 78 2c 20 22 2c 20 74 61 67 73 3a  suffix, ", tags:
9660: 20 25 68 22 2c 20 7a 54 61 67 29 3b 0a 20 20 20   %h", zTag);.   
9670: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9680: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26    blob_appendf(&
9690: 73 75 66 66 69 78 2c 20 22 2c 20 25 68 22 2c 20  suffix, ", %h", 
96a0: 7a 54 61 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zTag);.      }. 
96b0: 20 20 20 20 20 6e 54 61 67 2b 2b 3b 0a 20 20 20       nTag++;.   
96c0: 20 7d 0a 20 20 20 20 64 62 5f 66 69 6e 61 6c 69   }.    db_finali
96d0: 7a 65 28 26 71 29 3b 0a 20 20 20 20 62 6c 6f 62  ze(&q);.    blob
96e0: 5f 61 70 70 65 6e 64 66 28 26 73 75 66 66 69 78  _appendf(&suffix
96f0: 2c 20 22 29 22 29 3b 0a 20 20 20 20 40 20 25 73  , ")");.    @ %s
9700: 28 62 6c 6f 62 5f 73 74 72 28 26 73 75 66 66 69  (blob_str(&suffi
9710: 78 29 29 0a 20 20 20 20 40 20 3c 2f 74 64 3e 3c  x)).    @ </td><
9720: 2f 74 72 3e 3c 2f 74 61 62 6c 65 3e 0a 20 20 20  /tr></table>.   
9730: 20 40 20 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e   @ </blockquote>
9740: 0a 20 20 20 20 40 20 3c 68 72 3e 0a 20 20 20 20  .    @ <hr>.    
9750: 62 6c 6f 62 5f 72 65 73 65 74 28 26 73 75 66 66  blob_reset(&suff
9760: 69 78 29 3b 0a 20 20 7d 0a 20 20 40 20 3c 70 3e  ix);.  }.  @ <p>
9770: 4d 61 6b 65 20 63 68 61 6e 67 65 73 20 74 6f 20  Make changes to 
9780: 61 74 74 72 69 62 75 74 65 73 20 6f 66 20 63 68  attributes of ch
9790: 65 63 6b 2d 69 6e 0a 20 20 40 20 5b 3c 61 20 68  eck-in.  @ [<a h
97a0: 72 65 66 3d 22 63 69 3f 6e 61 6d 65 3d 25 64 28  ref="ci?name=%d(
97b0: 72 69 64 29 22 3e 25 73 28 7a 55 75 69 64 29 3c  rid)">%s(zUuid)<
97c0: 2f 61 3e 5d 3a 3c 2f 70 3e 0a 20 20 40 20 3c 66  /a>]:</p>.  @ <f
97d0: 6f 72 6d 20 61 63 74 69 6f 6e 3d 22 25 73 28 67  orm action="%s(g
97e0: 2e 7a 42 61 73 65 55 52 4c 29 2f 63 69 5f 65 64  .zBaseURL)/ci_ed
97f0: 69 74 22 20 6d 65 74 68 6f 64 3d 22 50 4f 53 54  it" method="POST
9800: 22 3e 0a 20 20 6c 6f 67 69 6e 5f 69 6e 73 65 72  ">.  login_inser
9810: 74 5f 63 73 72 66 5f 73 65 63 72 65 74 28 29 3b  t_csrf_secret();
9820: 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65  .  @ <input type
9830: 3d 22 68 69 64 64 65 6e 22 20 6e 61 6d 65 3d 22  ="hidden" name="
9840: 72 22 20 76 61 6c 75 65 3d 22 25 64 28 72 69 64  r" value="%d(rid
9850: 29 22 3e 0a 20 20 40 20 3c 74 61 62 6c 65 20 62  )">.  @ <table b
9860: 6f 72 64 65 72 3d 22 30 22 20 63 65 6c 6c 73 70  order="0" cellsp
9870: 61 63 69 6e 67 3d 22 31 30 22 3e 0a 0a 20 20 40  acing="10">..  @
9880: 20 3c 74 72 3e 3c 74 64 20 61 6c 69 67 6e 3d 22   <tr><td align="
9890: 72 69 67 68 74 22 20 76 61 6c 69 67 6e 3d 22 74  right" valign="t
98a0: 6f 70 22 3e 3c 62 3e 55 73 65 72 3a 3c 2f 62 3e  op"><b>User:</b>
98b0: 3c 2f 74 64 3e 0a 20 20 40 20 3c 74 64 20 76 61  </td>.  @ <td va
98c0: 6c 69 67 6e 3d 22 74 6f 70 22 3e 0a 20 20 40 20  lign="top">.  @ 
98d0: 20 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 74    <input type="t
98e0: 65 78 74 22 20 6e 61 6d 65 3d 22 75 22 20 73 69  ext" name="u" si
98f0: 7a 65 3d 22 32 30 22 20 76 61 6c 75 65 3d 22 25  ze="20" value="%
9900: 68 28 7a 4e 65 77 55 73 65 72 29 22 3e 0a 20 20  h(zNewUser)">.  
9910: 40 20 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 0a 20 20  @ </td></tr>..  
9920: 40 20 3c 74 72 3e 3c 74 64 20 61 6c 69 67 6e 3d  @ <tr><td align=
9930: 22 72 69 67 68 74 22 20 76 61 6c 69 67 6e 3d 22  "right" valign="
9940: 74 6f 70 22 3e 3c 62 3e 43 6f 6d 6d 65 6e 74 3a  top"><b>Comment:
9950: 3c 2f 62 3e 3c 2f 74 64 3e 0a 20 20 40 20 3c 74  </b></td>.  @ <t
9960: 64 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 0a  d valign="top">.
9970: 20 20 40 20 3c 74 65 78 74 61 72 65 61 20 6e 61    @ <textarea na
9980: 6d 65 3d 22 63 22 20 72 6f 77 73 3d 22 31 30 22  me="c" rows="10"
9990: 20 63 6f 6c 73 3d 22 38 30 22 3e 25 68 28 7a 4e   cols="80">%h(zN
99a0: 65 77 43 6f 6d 6d 65 6e 74 29 3c 2f 74 65 78 74  ewComment)</text
99b0: 61 72 65 61 3e 0a 20 20 40 20 3c 2f 74 64 3e 3c  area>.  @ </td><
99c0: 2f 74 72 3e 0a 0a 20 20 40 20 3c 74 72 3e 3c 74  /tr>..  @ <tr><t
99d0: 64 20 61 6c 69 67 6e 3d 22 72 69 67 68 74 22 20  d align="right" 
99e0: 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 3c 62 3e  valign="top"><b>
99f0: 43 68 65 63 6b 2d 69 6e 20 54 69 6d 65 3a 3c 2f  Check-in Time:</
9a00: 62 3e 3c 2f 74 64 3e 0a 20 20 40 20 3c 74 64 20  b></td>.  @ <td 
9a10: 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 0a 20 20  valign="top">.  
9a20: 40 20 20 20 3c 69 6e 70 75 74 20 74 79 70 65 3d  @   <input type=
9a30: 22 74 65 78 74 22 20 6e 61 6d 65 3d 22 64 74 22  "text" name="dt"
9a40: 20 73 69 7a 65 3d 22 32 30 22 20 76 61 6c 75 65   size="20" value
9a50: 3d 22 25 68 28 7a 4e 65 77 44 61 74 65 29 22 3e  ="%h(zNewDate)">
9a60: 0a 20 20 40 20 3c 2f 74 64 3e 3c 2f 74 72 3e 0a  .  @ </td></tr>.
9a70: 0a 20 20 40 20 3c 74 72 3e 3c 74 64 20 61 6c 69  .  @ <tr><td ali
9a80: 67 6e 3d 22 72 69 67 68 74 22 20 76 61 6c 69 67  gn="right" valig
9a90: 6e 3d 22 74 6f 70 22 3e 3c 62 3e 42 61 63 6b 67  n="top"><b>Backg
9aa0: 72 6f 75 6e 64 20 43 6f 6c 6f 72 3a 3c 2f 62 3e  round Color:</b>
9ab0: 3c 2f 74 64 3e 0a 20 20 40 20 3c 74 64 20 76 61  </td>.  @ <td va
9ac0: 6c 69 67 6e 3d 22 74 6f 70 22 3e 0a 20 20 40 20  lign="top">.  @ 
9ad0: 3c 74 61 62 6c 65 20 62 6f 72 64 65 72 3d 30 20  <table border=0 
9ae0: 63 65 6c 6c 70 61 64 64 69 6e 67 3d 30 20 63 65  cellpadding=0 ce
9af0: 6c 6c 73 70 61 63 69 6e 67 3d 31 3e 0a 20 20 40  llspacing=1>.  @
9b00: 20 3c 74 72 3e 3c 74 64 20 63 6f 6c 73 70 61 6e   <tr><td colspan
9b10: 3d 22 36 22 20 61 6c 69 67 6e 3d 22 6c 65 66 74  ="6" align="left
9b20: 22 3e 0a 20 20 69 66 28 20 66 50 72 6f 70 61 67  ">.  if( fPropag
9b30: 61 74 65 43 6f 6c 6f 72 20 29 7b 0a 20 20 20 20  ateColor ){.    
9b40: 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 63  @ <input type="c
9b50: 68 65 63 6b 62 6f 78 22 20 6e 61 6d 65 3d 22 70  heckbox" name="p
9b60: 63 6c 72 22 20 63 68 65 63 6b 65 64 3e 0a 20 20  clr" checked>.  
9b70: 7d 65 6c 73 65 7b 0a 20 20 20 20 40 20 3c 69 6e  }else{.    @ <in
9b80: 70 75 74 20 74 79 70 65 3d 22 63 68 65 63 6b 62  put type="checkb
9b90: 6f 78 22 20 6e 61 6d 65 3d 22 70 63 6c 72 22 3e  ox" name="pclr">
9ba0: 0a 20 20 7d 0a 20 20 40 20 50 72 6f 70 61 67 61  .  }.  @ Propaga
9bb0: 74 65 20 63 6f 6c 6f 72 20 74 6f 20 64 65 73 63  te color to desc
9bc0: 65 6e 64 61 6e 74 73 3c 2f 69 6e 70 75 74 3e 3c  endants</input><
9bd0: 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c 74  /td></tr>.  @ <t
9be0: 72 3e 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  r>.  for(i=0; i<
9bf0: 6e 43 6f 6c 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20  nColor; i++){.  
9c00: 20 20 69 66 28 20 61 43 6f 6c 6f 72 5b 69 5d 2e    if( aColor[i].
9c10: 7a 43 6f 6c 6f 72 5b 30 5d 20 29 7b 0a 20 20 20  zColor[0] ){.   
9c20: 20 20 20 40 20 3c 74 64 20 62 67 63 6f 6c 6f 72     @ <td bgcolor
9c30: 3d 22 25 68 28 61 43 6f 6c 6f 72 5b 69 5d 2e 7a  ="%h(aColor[i].z
9c40: 43 6f 6c 6f 72 29 22 3e 0a 20 20 20 20 7d 65 6c  Color)">.    }el
9c50: 73 65 7b 0a 20 20 20 20 20 20 40 20 3c 74 64 3e  se{.      @ <td>
9c60: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
9c70: 74 72 63 6d 70 28 7a 4e 65 77 43 6f 6c 6f 72 2c  trcmp(zNewColor,
9c80: 20 61 43 6f 6c 6f 72 5b 69 5d 2e 7a 43 6f 6c 6f   aColor[i].zColo
9c90: 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 40  r)==0 ){.      @
9ca0: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 72 61   <input type="ra
9cb0: 64 69 6f 22 20 6e 61 6d 65 3d 22 63 6c 72 22 20  dio" name="clr" 
9cc0: 76 61 6c 75 65 3d 22 25 68 28 61 43 6f 6c 6f 72  value="%h(aColor
9cd0: 5b 69 5d 2e 7a 43 6f 6c 6f 72 29 22 20 63 68 65  [i].zColor)" che
9ce0: 63 6b 65 64 3e 0a 20 20 20 20 7d 65 6c 73 65 7b  cked>.    }else{
9cf0: 0a 20 20 20 20 20 20 40 20 3c 69 6e 70 75 74 20  .      @ <input 
9d00: 74 79 70 65 3d 22 72 61 64 69 6f 22 20 6e 61 6d  type="radio" nam
9d10: 65 3d 22 63 6c 72 22 20 76 61 6c 75 65 3d 22 25  e="clr" value="%
9d20: 68 28 61 43 6f 6c 6f 72 5b 69 5d 2e 7a 43 6f 6c  h(aColor[i].zCol
9d30: 6f 72 29 22 3e 0a 20 20 20 20 7d 0a 20 20 20 20  or)">.    }.    
9d40: 40 20 25 68 28 61 43 6f 6c 6f 72 5b 69 5d 2e 7a  @ %h(aColor[i].z
9d50: 43 4e 61 6d 65 29 3c 2f 69 6e 70 75 74 3e 3c 2f  CName)</input></
9d60: 74 64 3e 0a 20 20 20 20 69 66 28 20 28 69 25 36  td>.    if( (i%6
9d70: 29 3d 3d 35 20 26 26 20 69 2b 31 3c 6e 43 6f 6c  )==5 && i+1<nCol
9d80: 6f 72 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 2f  or ){.      @ </
9d90: 74 72 3e 3c 74 72 3e 0a 20 20 20 20 7d 0a 20 20  tr><tr>.    }.  
9da0: 7d 0a 20 20 40 20 3c 2f 74 72 3e 0a 20 20 40 20  }.  @ </tr>.  @ 
9db0: 3c 2f 74 61 62 6c 65 3e 0a 20 20 40 20 3c 2f 74  </table>.  @ </t
9dc0: 64 3e 3c 2f 74 72 3e 0a 0a 20 20 40 20 3c 74 72  d></tr>..  @ <tr
9dd0: 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 72 69 67 68  ><td align="righ
9de0: 74 22 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e  t" valign="top">
9df0: 3c 62 3e 54 61 67 73 3a 3c 2f 62 3e 3c 2f 74 64  <b>Tags:</b></td
9e00: 3e 0a 20 20 40 20 3c 74 64 20 76 61 6c 69 67 6e  >.  @ <td valign
9e10: 3d 22 74 6f 70 22 3e 0a 20 20 40 20 3c 69 6e 70  ="top">.  @ <inp
9e20: 75 74 20 74 79 70 65 3d 22 63 68 65 63 6b 62 6f  ut type="checkbo
9e30: 78 22 20 6e 61 6d 65 3d 22 6e 65 77 74 61 67 22  x" name="newtag"
9e40: 25 73 28 7a 4e 65 77 54 61 67 46 6c 61 67 29 3e  %s(zNewTagFlag)>
9e50: 0a 20 20 40 20 41 64 64 20 74 68 65 20 66 6f 6c  .  @ Add the fol
9e60: 6c 6f 77 69 6e 67 20 6e 65 77 20 74 61 67 20 6e  lowing new tag n
9e70: 61 6d 65 20 74 6f 20 74 68 69 73 20 63 68 65 63  ame to this chec
9e80: 6b 2d 69 6e 3a 0a 20 20 40 20 3c 69 6e 70 75 74  k-in:.  @ <input
9e90: 20 74 79 70 65 3d 22 74 65 78 74 22 20 77 69 64   type="text" wid
9ea0: 74 68 3d 22 31 35 22 20 6e 61 6d 65 3d 22 74 61  th="15" name="ta
9eb0: 67 6e 61 6d 65 22 20 76 61 6c 75 65 3d 22 25 68  gname" value="%h
9ec0: 28 7a 4e 65 77 54 61 67 29 22 3e 0a 20 20 64 62  (zNewTag)">.  db
9ed0: 5f 70 72 65 70 61 72 65 28 26 71 2c 0a 20 20 20  _prepare(&q,.   
9ee0: 20 20 22 53 45 4c 45 43 54 20 74 61 67 2e 74 61    "SELECT tag.ta
9ef0: 67 69 64 2c 20 74 61 67 6e 61 6d 65 20 46 52 4f  gid, tagname FRO
9f00: 4d 20 74 61 67 78 72 65 66 2c 20 74 61 67 22 0a  M tagxref, tag".
9f10: 20 20 20 20 20 22 20 57 48 45 52 45 20 74 61 67       " WHERE tag
9f20: 78 72 65 66 2e 72 69 64 3d 25 64 20 41 4e 44 20  xref.rid=%d AND 
9f30: 74 61 67 74 79 70 65 3e 30 20 41 4e 44 20 74 61  tagtype>0 AND ta
9f40: 67 78 72 65 66 2e 74 61 67 69 64 3d 74 61 67 2e  gxref.tagid=tag.
9f50: 74 61 67 69 64 22 0a 20 20 20 20 20 22 20 4f 52  tagid".     " OR
9f60: 44 45 52 20 42 59 20 43 41 53 45 20 57 48 45 4e  DER BY CASE WHEN
9f70: 20 74 61 67 6e 61 6d 65 20 47 4c 4f 42 20 27 73   tagname GLOB 's
9f80: 79 6d 2d 2a 27 20 54 48 45 4e 20 73 75 62 73 74  ym-*' THEN subst
9f90: 72 28 74 61 67 6e 61 6d 65 2c 35 29 22 0a 20 20  r(tagname,5)".  
9fa0: 20 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20     "            
9fb0: 20 20 20 45 4c 53 45 20 74 61 67 6e 61 6d 65 20     ELSE tagname 
9fc0: 45 4e 44 22 2c 0a 20 20 20 20 20 72 69 64 0a 20  END",.     rid. 
9fd0: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 64 62 5f   );.  while( db_
9fe0: 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45  step(&q)==SQLITE
9ff0: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74 20  _ROW ){.    int 
a000: 74 61 67 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d  tagid = db_colum
a010: 6e 5f 69 6e 74 28 26 71 2c 20 30 29 3b 0a 20 20  n_int(&q, 0);.  
a020: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
a030: 61 67 4e 61 6d 65 20 3d 20 64 62 5f 63 6f 6c 75  agName = db_colu
a040: 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31 29 3b 0a  mn_text(&q, 1);.
a050: 20 20 20 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b      char zLabel[
a060: 33 30 5d 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  30];.    sprintf
a070: 28 7a 4c 61 62 65 6c 2c 20 22 63 25 64 22 2c 20  (zLabel, "c%d", 
a080: 74 61 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20  tagid);.    if( 
a090: 50 28 7a 4c 61 62 65 6c 29 20 29 7b 0a 20 20 20  P(zLabel) ){.   
a0a0: 20 20 20 40 20 3c 62 72 3e 3c 69 6e 70 75 74 20     @ <br><input 
a0b0: 74 79 70 65 3d 22 63 68 65 63 6b 62 6f 78 22 20  type="checkbox" 
a0c0: 6e 61 6d 65 3d 22 63 25 64 28 74 61 67 69 64 29  name="c%d(tagid)
a0d0: 22 20 63 68 65 63 6b 65 64 3e 0a 20 20 20 20 7d  " checked>.    }
a0e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 40 20 3c 62  else{.      @ <b
a0f0: 72 3e 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 63  r><input type="c
a100: 68 65 63 6b 62 6f 78 22 20 6e 61 6d 65 3d 22 63  heckbox" name="c
a110: 25 64 28 74 61 67 69 64 29 22 3e 0a 20 20 20 20  %d(tagid)">.    
a120: 7d 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  }.    if( strncm
a130: 70 28 7a 54 61 67 4e 61 6d 65 2c 20 22 73 79 6d  p(zTagName, "sym
a140: 2d 22 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20  -", 4)==0 ){.   
a150: 20 20 20 40 20 43 61 6e 63 65 6c 20 74 61 67 20     @ Cancel tag 
a160: 3c 62 3e 25 68 28 26 7a 54 61 67 4e 61 6d 65 5b  <b>%h(&zTagName[
a170: 34 5d 29 3c 2f 62 3e 0a 20 20 20 20 7d 65 6c 73  4])</b>.    }els
a180: 65 7b 0a 20 20 20 20 20 20 40 20 43 61 6e 63 65  e{.      @ Cance
a190: 6c 20 73 70 65 63 69 61 6c 20 74 61 67 20 3c 62  l special tag <b
a1a0: 3e 25 68 28 7a 54 61 67 4e 61 6d 65 29 3c 2f 62  >%h(zTagName)</b
a1b0: 3e 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62  >.    }.  }.  db
a1c0: 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20  _finalize(&q);. 
a1d0: 20 40 20 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 0a 20   @ </td></tr>.. 
a1e0: 20 69 66 28 20 64 62 5f 65 78 69 73 74 73 28 22   if( db_exists("
a1f0: 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 74 61  SELECT 1 FROM ta
a200: 67 78 72 65 66 20 57 48 45 52 45 20 72 69 64 3d  gxref WHERE rid=
a210: 25 64 20 41 4e 44 20 74 61 67 69 64 3d 25 64 20  %d AND tagid=%d 
a220: 41 4e 44 20 73 72 63 69 64 3e 30 22 2c 0a 20 20  AND srcid>0",.  
a230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 69                ri
a240: 64 2c 20 54 41 47 5f 42 52 41 4e 43 48 29 3d 3d  d, TAG_BRANCH)==
a250: 30 20 29 7b 0a 20 20 20 20 40 20 3c 74 72 3e 3c  0 ){.    @ <tr><
a260: 74 64 20 61 6c 69 67 6e 3d 22 72 69 67 68 74 22  td align="right"
a270: 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 3c 62   valign="top"><b
a280: 3e 42 72 61 6e 63 68 69 6e 67 3a 3c 2f 62 3e 3c  >Branching:</b><
a290: 2f 74 64 3e 0a 20 20 20 20 40 20 3c 74 64 20 76  /td>.    @ <td v
a2a0: 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 0a 20 20 20  align="top">.   
a2b0: 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22   @ <input type="
a2c0: 63 68 65 63 6b 62 6f 78 22 20 6e 61 6d 65 3d 22  checkbox" name="
a2d0: 6e 65 77 62 72 22 25 73 28 7a 4e 65 77 42 72 46  newbr"%s(zNewBrF
a2e0: 6c 61 67 29 3e 0a 20 20 20 20 40 20 4d 61 6b 65  lag)>.    @ Make
a2f0: 20 74 68 69 73 20 63 68 65 63 6b 2d 69 6e 20 74   this check-in t
a300: 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 6e 65  he start of a ne
a310: 77 20 62 72 61 6e 63 68 20 6e 61 6d 65 64 3a 0a  w branch named:.
a320: 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70      @ <input typ
a330: 65 3d 22 74 65 78 74 22 20 77 69 64 74 68 3d 22  e="text" width="
a340: 31 35 22 20 6e 61 6d 65 3d 22 62 72 6e 61 6d 65  15" name="brname
a350: 22 20 76 61 6c 75 65 3d 22 25 68 28 7a 4e 65 77  " value="%h(zNew
a360: 42 72 61 6e 63 68 29 22 3e 0a 20 20 20 20 40 20  Branch)">.    @ 
a370: 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 7d 0a 0a  </td></tr>.  }..
a380: 20 20 69 66 28 20 69 73 5f 61 5f 6c 65 61 66 28    if( is_a_leaf(
a390: 72 69 64 29 0a 20 20 20 26 26 20 21 64 62 5f 65  rid).   && !db_e
a3a0: 78 69 73 74 73 28 22 53 45 4c 45 43 54 20 31 20  xists("SELECT 1 
a3b0: 46 52 4f 4d 20 74 61 67 78 72 65 66 20 22 0a 20  FROM tagxref ". 
a3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3d0: 22 20 57 48 45 52 45 20 74 61 67 69 64 3d 25 64  " WHERE tagid=%d
a3e0: 20 41 4e 44 20 72 69 64 3d 25 64 20 41 4e 44 20   AND rid=%d AND 
a3f0: 74 61 67 74 79 70 65 3e 30 22 2c 0a 20 20 20 20  tagtype>0",.    
a400: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 41 47               TAG
a410: 5f 43 4c 4f 53 45 44 2c 20 72 69 64 29 0a 20 20  _CLOSED, rid).  
a420: 29 7b 0a 20 20 20 20 40 20 3c 74 72 3e 3c 74 64  ){.    @ <tr><td
a430: 20 61 6c 69 67 6e 3d 22 72 69 67 68 74 22 20 76   align="right" v
a440: 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 3c 62 3e 4c  align="top"><b>L
a450: 65 61 66 20 43 6c 6f 73 75 72 65 3a 3c 2f 62 3e  eaf Closure:</b>
a460: 3c 2f 74 64 3e 0a 20 20 20 20 40 20 3c 74 64 20  </td>.    @ <td 
a470: 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 0a 20 20  valign="top">.  
a480: 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d    @ <input type=
a490: 22 63 68 65 63 6b 62 6f 78 22 20 6e 61 6d 65 3d  "checkbox" name=
a4a0: 22 63 6c 6f 73 65 22 25 73 28 7a 43 6c 6f 73 65  "close"%s(zClose
a4b0: 46 6c 61 67 29 3e 0a 20 20 20 20 40 20 4d 61 72  Flag)>.    @ Mar
a4c0: 6b 20 74 68 69 73 20 6c 65 61 66 20 61 73 20 22  k this leaf as "
a4d0: 63 6c 6f 73 65 64 22 20 73 6f 20 74 68 61 74 20  closed" so that 
a4e0: 69 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 70 70  it no longer app
a4f0: 65 61 72 73 20 6f 6e 20 74 68 65 0a 20 20 20 20  ears on the.    
a500: 40 20 22 6c 65 61 76 65 73 22 20 70 61 67 65 20  @ "leaves" page 
a510: 61 6e 64 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  and is no longer
a520: 20 6c 61 62 65 6c 65 64 20 61 73 20 61 20 22 3c   labeled as a "<
a530: 62 3e 4c 65 61 66 3c 2f 62 3e 22 2e 0a 20 20 20  b>Leaf</b>"..   
a540: 20 40 20 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20   @ </td></tr>.  
a550: 7d 0a 0a 0a 20 20 40 20 3c 74 72 3e 3c 74 64 20  }...  @ <tr><td 
a560: 63 6f 6c 73 70 61 6e 3d 22 32 22 3e 0a 20 20 40  colspan="2">.  @
a570: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75   <input type="su
a580: 62 6d 69 74 22 20 6e 61 6d 65 3d 22 70 72 65 76  bmit" name="prev
a590: 69 65 77 22 20 76 61 6c 75 65 3d 22 50 72 65 76  iew" value="Prev
a5a0: 69 65 77 22 3e 0a 20 20 40 20 3c 69 6e 70 75 74  iew">.  @ <input
a5b0: 20 74 79 70 65 3d 22 73 75 62 6d 69 74 22 20 6e   type="submit" n
a5c0: 61 6d 65 3d 22 61 70 70 6c 79 22 20 76 61 6c 75  ame="apply" valu
a5d0: 65 3d 22 41 70 70 6c 79 20 43 68 61 6e 67 65 73  e="Apply Changes
a5e0: 22 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79  ">.  @ <input ty
a5f0: 70 65 3d 22 73 75 62 6d 69 74 22 20 6e 61 6d 65  pe="submit" name
a600: 3d 22 63 61 6e 63 65 6c 22 20 76 61 6c 75 65 3d  ="cancel" value=
a610: 22 43 61 6e 63 65 6c 22 3e 0a 20 20 40 20 3c 2f  "Cancel">.  @ </
a620: 74 64 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c 2f 74  td></tr>.  @ </t
a630: 61 62 6c 65 3e 0a 20 20 40 20 3c 2f 66 6f 72 6d  able>.  @ </form
a640: 3e 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72  >.  style_footer
a650: 28 29 3b 0a 7d 0a                                ();.}.