Fossil

Hex Artifact Content
Login

Artifact 2aabd8d91a1824c3e520e002c2887ae4f355eeab8f47db2f39100bf9ab201dde:


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 53 69 6d 70 6c 69 66 69 65 64 20 42 53 44 20   Simplified BSD 
00a0: 4c 69 63 65 6e 73 65 20 28 61 6c 73 6f 0a 2a 2a  License (also.**
00b0: 20 6b 6e 6f 77 6e 20 61 73 20 74 68 65 20 22 32   known as the "2
00c0: 2d 43 6c 61 75 73 65 20 4c 69 63 65 6e 73 65 22  -Clause License"
00d0: 20 6f 72 20 22 46 72 65 65 42 53 44 20 4c 69 63   or "FreeBSD Lic
00e0: 65 6e 73 65 22 2e 29 0a 0a 2a 2a 20 54 68 69 73  ense".)..** This
00f0: 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73 74   program is dist
0100: 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20 68  ributed in the h
0110: 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c 6c  ope that it will
0120: 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20 62   be useful,.** b
0130: 75 74 20 77 69 74 68 6f 75 74 20 61 6e 79 20 77  ut without any w
0140: 61 72 72 61 6e 74 79 3b 20 77 69 74 68 6f 75 74  arranty; without
0150: 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 65   even the implie
0160: 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a 2a  d warranty of.**
0170: 20 6d 65 72 63 68 61 6e 74 61 62 69 6c 69 74 79   merchantability
0180: 20 6f 72 20 66 69 74 6e 65 73 73 20 66 6f 72 20   or fitness for 
0190: 61 20 70 61 72 74 69 63 75 6c 61 72 20 70 75 72  a particular pur
01a0: 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 75 74 68  pose..**.** Auth
01b0: 6f 72 20 63 6f 6e 74 61 63 74 20 69 6e 66 6f 72  or contact infor
01c0: 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20 64 72 68  mation:.**   drh
01d0: 40 68 77 61 63 69 2e 63 6f 6d 0a 2a 2a 20 20 20  @hwaci.com.**   
01e0: 68 74 74 70 3a 2f 2f 77 77 77 2e 68 77 61 63 69  http://www.hwaci
01f0: 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a 0a 2a 2a 2a  .com/drh/.**.***
0200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
0250: 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e  ** This file con
0260: 74 61 69 6e 73 20 63 6f 64 65 20 74 6f 20 69 6d  tains code to im
0270: 70 6c 65 6d 65 6e 74 20 74 68 65 20 22 69 6e 66  plement the "inf
0280: 6f 22 20 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 65  o" command.  The
0290: 0a 2a 2a 20 22 69 6e 66 6f 22 20 63 6f 6d 6d 61  .** "info" comma
02a0: 6e 64 20 67 69 76 65 73 20 63 6f 6d 6d 61 6e 64  nd gives command
02b0: 2d 6c 69 6e 65 20 61 63 63 65 73 73 20 74 6f 20  -line access to 
02c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
02d0: 74 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  t.** the current
02e0: 20 74 72 65 65 2c 20 6f 72 20 61 20 70 61 72 74   tree, or a part
02f0: 69 63 75 6c 61 72 20 61 72 74 69 66 61 63 74 20  icular artifact 
0300: 6f 72 20 63 68 65 63 6b 2d 69 6e 2e 0a 2a 2f 0a  or check-in..*/.
0310: 23 69 6e 63 6c 75 64 65 20 22 63 6f 6e 66 69 67  #include "config
0320: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 69 6e  .h".#include "in
0330: 66 6f 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  fo.h".#include <
0340: 61 73 73 65 72 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a  assert.h>../*.**
0350: 20 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67   Return a string
0360: 20 28 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61   (in memory obta
0370: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
0380: 29 20 68 6f 6c 64 69 6e 67 20 61 0a 2a 2a 20 63  ) holding a.** c
0390: 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65 64 20 6c  omma-separated l
03a0: 69 73 74 20 6f 66 20 74 61 67 73 20 74 68 61 74  ist of tags that
03b0: 20 61 70 70 6c 79 20 74 6f 20 63 68 65 63 6b 2d   apply to check-
03c0: 69 6e 20 77 69 74 68 0a 2a 2a 20 72 65 63 6f 72  in with.** recor
03d0: 64 2d 69 64 20 72 69 64 2e 20 20 49 66 20 74 68  d-id rid.  If th
03e0: 65 20 22 70 72 6f 70 61 67 61 74 69 6e 67 4f 6e  e "propagatingOn
03f0: 6c 79 22 20 66 6c 61 67 20 69 73 20 74 72 75 65  ly" flag is true
0400: 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 73  , then only.** s
0410: 68 6f 77 20 62 72 61 6e 63 68 20 74 61 67 73 20  how branch tags 
0420: 28 74 61 67 73 20 74 68 61 74 20 70 72 6f 70 61  (tags that propa
0430: 67 61 74 65 20 74 6f 20 63 68 69 6c 64 72 65 6e  gate to children
0440: 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  )..**.** Return 
0450: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72  NULL if there ar
0460: 65 20 6e 6f 20 73 75 63 68 20 74 61 67 73 2e 0a  e no such tags..
0470: 2a 2f 0a 63 68 61 72 20 2a 69 6e 66 6f 5f 74 61  */.char *info_ta
0480: 67 73 5f 6f 66 5f 63 68 65 63 6b 69 6e 28 69 6e  gs_of_checkin(in
0490: 74 20 72 69 64 2c 20 69 6e 74 20 70 72 6f 70 61  t rid, int propa
04a0: 67 61 74 69 6e 67 4f 6e 6c 79 29 7b 0a 20 20 63  gatingOnly){.  c
04b0: 68 61 72 20 2a 7a 54 61 67 73 3b 0a 20 20 7a 54  har *zTags;.  zT
04c0: 61 67 73 20 3d 20 64 62 5f 74 65 78 74 28 30 2c  ags = db_text(0,
04d0: 20 22 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63   "SELECT group_c
04e0: 6f 6e 63 61 74 28 73 75 62 73 74 72 28 74 61 67  oncat(substr(tag
04f0: 6e 61 6d 65 2c 20 35 29 2c 20 27 2c 20 27 29 22  name, 5), ', ')"
0500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0510: 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20 74 61        "  FROM ta
0520: 67 78 72 65 66 2c 20 74 61 67 22 0a 20 20 20 20  gxref, tag".    
0530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0540: 20 22 20 57 48 45 52 45 20 74 61 67 78 72 65 66   " WHERE tagxref
0550: 2e 72 69 64 3d 25 64 20 41 4e 44 20 74 61 67 78  .rid=%d AND tagx
0560: 72 65 66 2e 74 61 67 74 79 70 65 3e 25 64 22 0a  ref.tagtype>%d".
0570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0580: 20 20 20 20 20 22 20 20 20 41 4e 44 20 74 61 67       "   AND tag
0590: 2e 74 61 67 69 64 3d 74 61 67 78 72 65 66 2e 74  .tagid=tagxref.t
05a0: 61 67 69 64 22 0a 20 20 20 20 20 20 20 20 20 20  agid".          
05b0: 20 20 20 20 20 20 20 20 20 20 20 22 20 20 20 41             "   A
05c0: 4e 44 20 74 61 67 2e 74 61 67 6e 61 6d 65 20 47  ND tag.tagname G
05d0: 4c 4f 42 20 27 73 79 6d 2d 2a 27 22 2c 0a 20 20  LOB 'sym-*'",.  
05e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05f0: 20 20 20 72 69 64 2c 20 70 72 6f 70 61 67 61 74     rid, propagat
0600: 69 6e 67 4f 6e 6c 79 21 3d 30 29 3b 0a 20 20 72  ingOnly!=0);.  r
0610: 65 74 75 72 6e 20 7a 54 61 67 73 3b 0a 7d 0a 0a  eturn zTags;.}..
0620: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 63 6f 6d  ./*.** Print com
0630: 6d 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  mon information 
0640: 61 62 6f 75 74 20 61 20 70 61 72 74 69 63 75 6c  about a particul
0650: 61 72 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a  ar record..**.**
0660: 20 20 20 20 20 2a 20 20 54 68 65 20 55 55 49 44       *  The UUID
0670: 0a 2a 2a 20 20 20 20 20 2a 20 20 54 68 65 20 72  .**     *  The r
0680: 65 63 6f 72 64 20 49 44 0a 2a 2a 20 20 20 20 20  ecord ID.**     
0690: 2a 20 20 6d 74 69 6d 65 20 61 6e 64 20 63 74 69  *  mtime and cti
06a0: 6d 65 0a 2a 2a 20 20 20 20 20 2a 20 20 77 68 6f  me.**     *  who
06b0: 20 73 69 67 6e 65 64 20 69 74 0a 2a 2a 0a 2a 2f   signed it.**.*/
06c0: 0a 76 6f 69 64 20 73 68 6f 77 5f 63 6f 6d 6d 6f  .void show_commo
06d0: 6e 5f 69 6e 66 6f 28 0a 20 20 69 6e 74 20 72 69  n_info(.  int ri
06e0: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
06f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 64 20       /* The rid 
0700: 66 6f 72 20 74 68 65 20 63 68 65 63 6b 2d 69 6e  for the check-in
0710: 20 74 6f 20 64 69 73 70 6c 61 79 20 69 6e 66 6f   to display info
0720: 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   for */.  const 
0730: 63 68 61 72 20 2a 7a 55 75 69 64 4e 61 6d 65 2c  char *zUuidName,
0740: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
0750: 74 68 65 20 55 55 49 44 20 2a 2f 0a 20 20 69 6e  the UUID */.  in
0760: 74 20 73 68 6f 77 43 6f 6d 6d 65 6e 74 2c 20 20  t showComment,  
0770: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
0780: 20 74 6f 20 73 68 6f 77 20 74 68 65 20 63 68 65   to show the che
0790: 63 6b 2d 69 6e 20 63 6f 6d 6d 65 6e 74 20 2a 2f  ck-in comment */
07a0: 0a 20 20 69 6e 74 20 73 68 6f 77 46 61 6d 69 6c  .  int showFamil
07b0: 79 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  y             /*
07c0: 20 54 72 75 65 20 74 6f 20 73 68 6f 77 20 70 61   True to show pa
07d0: 72 65 6e 74 73 20 61 6e 64 20 63 68 69 6c 64 72  rents and childr
07e0: 65 6e 20 2a 2f 0a 29 7b 0a 20 20 53 74 6d 74 20  en */.){.  Stmt 
07f0: 71 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d  q;.  char *zComm
0800: 65 6e 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ent = 0;.  char 
0810: 2a 7a 54 61 67 73 3b 0a 20 20 63 68 61 72 20 2a  *zTags;.  char *
0820: 7a 44 61 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a  zDate;.  char *z
0830: 55 75 69 64 3b 0a 20 20 7a 55 75 69 64 20 3d 20  Uuid;.  zUuid = 
0840: 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45  db_text(0, "SELE
0850: 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f  CT uuid FROM blo
0860: 62 20 57 48 45 52 45 20 72 69 64 3d 25 64 22 2c  b WHERE rid=%d",
0870: 20 72 69 64 29 3b 0a 20 20 69 66 28 20 7a 55 75   rid);.  if( zUu
0880: 69 64 20 29 7b 0a 20 20 20 20 7a 44 61 74 65 20  id ){.    zDate 
0890: 3d 20 64 62 5f 74 65 78 74 28 30 2c 0a 20 20 20  = db_text(0,.   
08a0: 20 20 20 22 53 45 4c 45 43 54 20 64 61 74 65 74     "SELECT datet
08b0: 69 6d 65 28 6d 74 69 6d 65 29 20 7c 7c 20 27 20  ime(mtime) || ' 
08c0: 55 54 43 27 20 46 52 4f 4d 20 65 76 65 6e 74 20  UTC' FROM event 
08d0: 57 48 45 52 45 20 6f 62 6a 69 64 3d 25 64 22 2c  WHERE objid=%d",
08e0: 0a 20 20 20 20 20 20 72 69 64 0a 20 20 20 20 29  .      rid.    )
08f0: 3b 0a 20 20 20 20 20 20 20 20 20 2f 2a 20 30 31  ;.         /* 01
0900: 32 33 34 35 36 37 38 39 30 31 32 33 20 2a 2f 0a  234567890123 */.
0910: 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74      fossil_print
0920: 28 22 25 2d 31 33 73 20 25 2e 34 30 73 20 25 73  ("%-13s %.40s %s
0930: 5c 6e 22 2c 20 7a 55 75 69 64 4e 61 6d 65 2c 20  \n", zUuidName, 
0940: 7a 55 75 69 64 2c 20 7a 44 61 74 65 20 3f 20 7a  zUuid, zDate ? z
0950: 44 61 74 65 20 3a 20 22 22 29 3b 0a 20 20 20 20  Date : "");.    
0960: 66 72 65 65 28 7a 44 61 74 65 29 3b 0a 20 20 20  free(zDate);.   
0970: 20 69 66 28 20 73 68 6f 77 43 6f 6d 6d 65 6e 74   if( showComment
0980: 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 65   ){.      zComme
0990: 6e 74 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 0a  nt = db_text(0,.
09a0: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
09b0: 63 6f 61 6c 65 73 63 65 28 65 63 6f 6d 6d 65 6e  coalesce(ecommen
09c0: 74 2c 63 6f 6d 6d 65 6e 74 29 20 7c 7c 20 22 0a  t,comment) || ".
09d0: 20 20 20 20 20 20 20 20 22 20 20 20 20 20 20 20          "       
09e0: 27 20 28 75 73 65 72 3a 20 27 20 7c 7c 20 63 6f  ' (user: ' || co
09f0: 61 6c 65 73 63 65 28 65 75 73 65 72 2c 75 73 65  alesce(euser,use
0a00: 72 2c 27 3f 27 29 20 7c 7c 20 27 29 27 20 22 0a  r,'?') || ')' ".
0a10: 20 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20          "  FROM 
0a20: 65 76 65 6e 74 20 57 48 45 52 45 20 6f 62 6a 69  event WHERE obji
0a30: 64 3d 25 64 22 2c 0a 20 20 20 20 20 20 20 20 72  d=%d",.        r
0a40: 69 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  id.      );.    
0a50: 7d 0a 20 20 20 20 66 72 65 65 28 7a 55 75 69 64  }.    free(zUuid
0a60: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 68 6f  );.  }.  if( sho
0a70: 77 46 61 6d 69 6c 79 20 29 7b 0a 20 20 20 20 64  wFamily ){.    d
0a80: 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 22 53  b_prepare(&q, "S
0a90: 45 4c 45 43 54 20 75 75 69 64 2c 20 70 69 64 2c  ELECT uuid, pid,
0aa0: 20 69 73 70 72 69 6d 20 46 52 4f 4d 20 70 6c 69   isprim FROM pli
0ab0: 6e 6b 20 4a 4f 49 4e 20 62 6c 6f 62 20 4f 4e 20  nk JOIN blob ON 
0ac0: 70 69 64 3d 72 69 64 20 22 0a 20 20 20 20 20 20  pid=rid ".      
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
0ae0: 48 45 52 45 20 63 69 64 3d 25 64 22 0a 20 20 20  HERE cid=%d".   
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 22 20 4f 52 44 45 52 20 42 59 20 69 73 70 72 69  " ORDER BY ispri
0b10: 6d 20 44 45 53 43 2c 20 6d 74 69 6d 65 20 44 45  m DESC, mtime DE
0b20: 53 43 20 2f 2a 73 6f 72 74 2a 2f 22 2c 20 72 69  SC /*sort*/", ri
0b30: 64 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 64  d);.    while( d
0b40: 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49  b_step(&q)==SQLI
0b50: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
0b60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 75 69  const char *zUui
0b70: 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65  d = db_column_te
0b80: 78 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 20  xt(&q, 0);.     
0b90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
0ba0: 70 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69  pe = db_column_i
0bb0: 6e 74 28 26 71 2c 20 32 29 20 3f 20 22 70 61 72  nt(&q, 2) ? "par
0bc0: 65 6e 74 3a 22 20 3a 20 22 6d 65 72 67 65 64 2d  ent:" : "merged-
0bd0: 66 72 6f 6d 3a 22 3b 0a 20 20 20 20 20 20 7a 44  from:";.      zD
0be0: 61 74 65 20 3d 20 64 62 5f 74 65 78 74 28 22 22  ate = db_text(""
0bf0: 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  ,.        "SELEC
0c00: 54 20 64 61 74 65 74 69 6d 65 28 6d 74 69 6d 65  T datetime(mtime
0c10: 29 20 7c 7c 20 27 20 55 54 43 27 20 46 52 4f 4d  ) || ' UTC' FROM
0c20: 20 65 76 65 6e 74 20 57 48 45 52 45 20 6f 62 6a   event WHERE obj
0c30: 69 64 3d 25 64 22 2c 0a 20 20 20 20 20 20 20 20  id=%d",.        
0c40: 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71  db_column_int(&q
0c50: 2c 20 31 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  , 1).      );.  
0c60: 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74      fossil_print
0c70: 28 22 25 2d 31 33 73 20 25 2e 34 30 73 20 25 73  ("%-13s %.40s %s
0c80: 5c 6e 22 2c 20 7a 54 79 70 65 2c 20 7a 55 75 69  \n", zType, zUui
0c90: 64 2c 20 7a 44 61 74 65 29 3b 0a 20 20 20 20 20  d, zDate);.     
0ca0: 20 66 72 65 65 28 7a 44 61 74 65 29 3b 0a 20 20   free(zDate);.  
0cb0: 20 20 7d 0a 20 20 20 20 64 62 5f 66 69 6e 61 6c    }.    db_final
0cc0: 69 7a 65 28 26 71 29 3b 0a 20 20 20 20 64 62 5f  ize(&q);.    db_
0cd0: 70 72 65 70 61 72 65 28 26 71 2c 20 22 53 45 4c  prepare(&q, "SEL
0ce0: 45 43 54 20 75 75 69 64 2c 20 63 69 64 2c 20 69  ECT uuid, cid, i
0cf0: 73 70 72 69 6d 20 46 52 4f 4d 20 70 6c 69 6e 6b  sprim FROM plink
0d00: 20 4a 4f 49 4e 20 62 6c 6f 62 20 4f 4e 20 63 69   JOIN blob ON ci
0d10: 64 3d 72 69 64 20 22 0a 20 20 20 20 20 20 20 20  d=rid ".        
0d20: 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45             " WHE
0d30: 52 45 20 70 69 64 3d 25 64 22 0a 20 20 20 20 20  RE pid=%d".     
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
0d50: 4f 52 44 45 52 20 42 59 20 69 73 70 72 69 6d 20  ORDER BY isprim 
0d60: 44 45 53 43 2c 20 6d 74 69 6d 65 20 44 45 53 43  DESC, mtime DESC
0d70: 20 2f 2a 73 6f 72 74 2a 2f 22 2c 20 72 69 64 29   /*sort*/", rid)
0d80: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 64 62 5f  ;.    while( db_
0d90: 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45  step(&q)==SQLITE
0da0: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 63 6f  _ROW ){.      co
0db0: 6e 73 74 20 63 68 61 72 20 2a 7a 55 75 69 64 20  nst char *zUuid 
0dc0: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
0dd0: 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 20 20 63  (&q, 0);.      c
0de0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
0df0: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   = db_column_int
0e00: 28 26 71 2c 20 32 29 20 3f 20 22 63 68 69 6c 64  (&q, 2) ? "child
0e10: 3a 22 20 3a 20 22 6d 65 72 67 65 64 2d 69 6e 74  :" : "merged-int
0e20: 6f 3a 22 3b 0a 20 20 20 20 20 20 7a 44 61 74 65  o:";.      zDate
0e30: 20 3d 20 64 62 5f 74 65 78 74 28 22 22 2c 0a 20   = db_text("",. 
0e40: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 64         "SELECT d
0e50: 61 74 65 74 69 6d 65 28 6d 74 69 6d 65 29 20 7c  atetime(mtime) |
0e60: 7c 20 27 20 55 54 43 27 20 46 52 4f 4d 20 65 76  | ' UTC' FROM ev
0e70: 65 6e 74 20 57 48 45 52 45 20 6f 62 6a 69 64 3d  ent WHERE objid=
0e80: 25 64 22 2c 0a 20 20 20 20 20 20 20 20 64 62 5f  %d",.        db_
0e90: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 31  column_int(&q, 1
0ea0: 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ).      );.     
0eb0: 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 25   fossil_print("%
0ec0: 2d 31 33 73 20 25 2e 34 30 73 20 25 73 5c 6e 22  -13s %.40s %s\n"
0ed0: 2c 20 7a 54 79 70 65 2c 20 7a 55 75 69 64 2c 20  , zType, zUuid, 
0ee0: 7a 44 61 74 65 29 3b 0a 20 20 20 20 20 20 66 72  zDate);.      fr
0ef0: 65 65 28 7a 44 61 74 65 29 3b 0a 20 20 20 20 7d  ee(zDate);.    }
0f00: 0a 20 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65  .    db_finalize
0f10: 28 26 71 29 3b 0a 20 20 7d 0a 20 20 7a 54 61 67  (&q);.  }.  zTag
0f20: 73 20 3d 20 69 6e 66 6f 5f 74 61 67 73 5f 6f 66  s = info_tags_of
0f30: 5f 63 68 65 63 6b 69 6e 28 72 69 64 2c 20 30 29  _checkin(rid, 0)
0f40: 3b 0a 20 20 69 66 28 20 7a 54 61 67 73 20 26 26  ;.  if( zTags &&
0f50: 20 7a 54 61 67 73 5b 30 5d 20 29 7b 0a 20 20 20   zTags[0] ){.   
0f60: 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 74   fossil_print("t
0f70: 61 67 73 3a 20 20 20 20 20 20 20 20 20 25 73 5c  ags:         %s\
0f80: 6e 22 2c 20 7a 54 61 67 73 29 3b 0a 20 20 7d 0a  n", zTags);.  }.
0f90: 20 20 66 72 65 65 28 7a 54 61 67 73 29 3b 0a 20    free(zTags);. 
0fa0: 20 69 66 28 20 7a 43 6f 6d 6d 65 6e 74 20 29 7b   if( zComment ){
0fb0: 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e  .    fossil_prin
0fc0: 74 28 22 63 6f 6d 6d 65 6e 74 3a 20 20 20 20 20  t("comment:     
0fd0: 20 22 29 3b 0a 20 20 20 20 63 6f 6d 6d 65 6e 74   ");.    comment
0fe0: 5f 70 72 69 6e 74 28 7a 43 6f 6d 6d 65 6e 74 2c  _print(zComment,
0ff0: 20 30 2c 20 31 34 2c 20 2d 31 2c 20 67 65 74 5f   0, 14, -1, get_
1000: 63 6f 6d 6d 65 6e 74 5f 66 6f 72 6d 61 74 28 29  comment_format()
1010: 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6d  );.    free(zCom
1020: 6d 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ment);.  }.}../*
1030: 0a 2a 2a 20 50 72 69 6e 74 20 69 6e 66 6f 72 6d  .** Print inform
1040: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
1050: 55 52 4c 73 20 75 73 65 64 20 74 6f 20 61 63 63  URLs used to acc
1060: 65 73 73 20 61 20 72 65 70 6f 73 69 74 6f 72 79  ess a repository
1070: 20 61 6e 64 0a 2a 2a 20 63 68 65 63 6b 6f 75 74   and.** checkout
1080: 73 20 69 6e 20 61 20 72 65 70 6f 73 69 74 6f 72  s in a repositor
1090: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
10a0: 64 20 65 78 74 72 61 52 65 70 6f 49 6e 66 6f 28  d extraRepoInfo(
10b0: 76 6f 69 64 29 7b 0a 20 20 53 74 6d 74 20 73 3b  void){.  Stmt s;
10c0: 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 73  .  db_prepare(&s
10d0: 2c 20 22 53 45 4c 45 43 54 20 73 75 62 73 74 72  , "SELECT substr
10e0: 28 6e 61 6d 65 2c 37 29 2c 20 64 61 74 65 28 6d  (name,7), date(m
10f0: 74 69 6d 65 2c 27 75 6e 69 78 65 70 6f 63 68 27  time,'unixepoch'
1100: 29 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )".             
1110: 20 20 20 20 22 20 20 46 52 4f 4d 20 63 6f 6e 66      "  FROM conf
1120: 69 67 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  ig".            
1130: 20 20 20 20 20 22 20 57 48 45 52 45 20 6e 61 6d       " WHERE nam
1140: 65 20 47 4c 4f 42 20 27 63 6b 6f 75 74 3a 2a 27  e GLOB 'ckout:*'
1150: 20 4f 52 44 45 52 20 42 59 20 6d 74 69 6d 65 20   ORDER BY mtime 
1160: 44 45 53 43 22 29 3b 0a 20 20 77 68 69 6c 65 28  DESC");.  while(
1170: 20 64 62 5f 73 74 65 70 28 26 73 29 3d 3d 53 51   db_step(&s)==SQ
1180: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
1190: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
11a0: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
11b0: 72 20 2a 7a 43 6b 6f 75 74 20 3d 20 64 62 5f 63  r *zCkout = db_c
11c0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 73 2c 20 30  olumn_text(&s, 0
11d0: 29 3b 0a 20 20 20 20 69 66 28 20 21 76 66 69 6c  );.    if( !vfil
11e0: 65 5f 74 6f 70 5f 6f 66 5f 63 68 65 63 6b 6f 75  e_top_of_checkou
11f0: 74 28 7a 43 6b 6f 75 74 29 20 29 20 63 6f 6e 74  t(zCkout) ) cont
1200: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 67 2e  inue;.    if( g.
1210: 6c 6f 63 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  localOpen ){.   
1220: 20 20 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74     if( fossil_st
1230: 72 63 6d 70 28 7a 43 6b 6f 75 74 2c 20 67 2e 7a  rcmp(zCkout, g.z
1240: 4c 6f 63 61 6c 52 6f 6f 74 29 3d 3d 30 20 29 20  LocalRoot)==0 ) 
1250: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1260: 7a 4e 61 6d 65 20 3d 20 22 61 6c 74 2d 72 6f 6f  zName = "alt-roo
1270: 74 3a 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  t:";.    }else{.
1280: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 63        zName = "c
1290: 68 65 63 6b 2d 6f 75 74 3a 22 3b 0a 20 20 20 20  heck-out:";.    
12a0: 7d 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69  }.    fossil_pri
12b0: 6e 74 28 22 25 2d 31 31 73 20 20 20 25 2d 35 34  nt("%-11s   %-54
12c0: 73 20 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65 2c 20  s %s\n", zName, 
12d0: 7a 43 6b 6f 75 74 2c 0a 20 20 20 20 20 20 20 20  zCkout,.        
12e0: 20 20 20 20 20 20 20 20 20 64 62 5f 63 6f 6c 75           db_colu
12f0: 6d 6e 5f 74 65 78 74 28 26 73 2c 20 31 29 29 3b  mn_text(&s, 1));
1300: 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69  .  }.  db_finali
1310: 7a 65 28 26 73 29 3b 0a 20 20 64 62 5f 70 72 65  ze(&s);.  db_pre
1320: 70 61 72 65 28 26 73 2c 20 22 53 45 4c 45 43 54  pare(&s, "SELECT
1330: 20 73 75 62 73 74 72 28 6e 61 6d 65 2c 39 29 2c   substr(name,9),
1340: 20 64 61 74 65 28 6d 74 69 6d 65 2c 27 75 6e 69   date(mtime,'uni
1350: 78 65 70 6f 63 68 27 29 22 0a 20 20 20 20 20 20  xepoch')".      
1360: 20 20 20 20 20 20 20 20 20 20 20 22 20 20 46 52             "  FR
1370: 4f 4d 20 63 6f 6e 66 69 67 22 0a 20 20 20 20 20  OM config".     
1380: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
1390: 45 52 45 20 6e 61 6d 65 20 47 4c 4f 42 20 27 62  ERE name GLOB 'b
13a0: 61 73 65 75 72 6c 3a 2a 27 20 4f 52 44 45 52 20  aseurl:*' ORDER 
13b0: 42 59 20 6d 74 69 6d 65 20 44 45 53 43 22 29 3b  BY mtime DESC");
13c0: 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65  .  while( db_ste
13d0: 70 28 26 73 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  p(&s)==SQLITE_RO
13e0: 57 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f  W ){.    fossil_
13f0: 70 72 69 6e 74 28 22 61 63 63 65 73 73 2d 75 72  print("access-ur
1400: 6c 3a 20 20 20 25 2d 35 34 73 20 25 73 5c 6e 22  l:   %-54s %s\n"
1410: 2c 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  , db_column_text
1420: 28 26 73 2c 20 30 29 2c 0a 20 20 20 20 20 20 20  (&s, 0),.       
1430: 20 20 20 20 20 20 20 20 20 20 64 62 5f 63 6f 6c            db_col
1440: 75 6d 6e 5f 74 65 78 74 28 26 73 2c 20 31 29 29  umn_text(&s, 1))
1450: 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c  ;.  }.  db_final
1460: 69 7a 65 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ize(&s);.}../*.*
1470: 2a 20 53 68 6f 77 20 74 68 65 20 70 61 72 65 6e  * Show the paren
1480: 74 20 70 72 6f 6a 65 63 74 2c 20 69 66 20 61 6e  t project, if an
1490: 79 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  y.*/.static void
14a0: 20 73 68 6f 77 50 61 72 65 6e 74 50 72 6f 6a 65   showParentProje
14b0: 63 74 28 76 6f 69 64 29 7b 0a 20 20 63 6f 6e 73  ct(void){.  cons
14c0: 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43  t char *zParentC
14d0: 6f 64 65 3b 0a 20 20 7a 50 61 72 65 6e 74 43 6f  ode;.  zParentCo
14e0: 64 65 20 3d 20 64 62 5f 67 65 74 28 22 70 61 72  de = db_get("par
14f0: 65 6e 74 2d 70 72 6f 6a 65 63 74 2d 63 6f 64 65  ent-project-code
1500: 22 2c 30 29 3b 0a 20 20 69 66 28 20 7a 50 61 72  ",0);.  if( zPar
1510: 65 6e 74 43 6f 64 65 20 29 7b 0a 20 20 20 20 66  entCode ){.    f
1520: 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 64 65 72  ossil_print("der
1530: 69 76 65 64 2d 66 72 6f 6d 3a 20 25 73 20 25 73  ived-from: %s %s
1540: 5c 6e 22 2c 20 7a 50 61 72 65 6e 74 43 6f 64 65  \n", zParentCode
1550: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1560: 20 20 20 64 62 5f 67 65 74 28 22 70 61 72 65 6e     db_get("paren
1570: 74 2d 70 72 6f 6a 65 63 74 2d 6e 61 6d 65 22 2c  t-project-name",
1580: 22 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  ""));.  }.}.../*
1590: 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 69 6e 66  .** COMMAND: inf
15a0: 6f 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 25  o.**.** Usage: %
15b0: 66 6f 73 73 69 6c 20 69 6e 66 6f 20 3f 56 45 52  fossil info ?VER
15c0: 53 49 4f 4e 20 7c 20 52 45 50 4f 53 49 54 4f 52  SION | REPOSITOR
15d0: 59 5f 46 49 4c 45 4e 41 4d 45 3f 20 3f 4f 50 54  Y_FILENAME? ?OPT
15e0: 49 4f 4e 53 3f 0a 2a 2a 0a 2a 2a 20 57 69 74 68  IONS?.**.** With
15f0: 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20 70   no arguments, p
1600: 72 6f 76 69 64 65 20 69 6e 66 6f 72 6d 61 74 69  rovide informati
1610: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 75 72  on about the cur
1620: 72 65 6e 74 20 74 72 65 65 2e 0a 2a 2a 20 49 66  rent tree..** If
1630: 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20   an argument is 
1640: 73 70 65 63 69 66 69 65 64 2c 20 70 72 6f 76 69  specified, provi
1650: 64 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  de information a
1660: 62 6f 75 74 20 74 68 65 20 6f 62 6a 65 63 74 0a  bout the object.
1670: 2a 2a 20 69 6e 20 74 68 65 20 72 65 70 6f 73 69  ** in the reposi
1680: 74 6f 72 79 20 6f 66 20 74 68 65 20 63 75 72 72  tory of the curr
1690: 65 6e 74 20 74 72 65 65 20 74 68 61 74 20 74 68  ent tree that th
16a0: 65 20 61 72 67 75 6d 65 6e 74 20 72 65 66 65 72  e argument refer
16b0: 73 0a 2a 2a 20 74 6f 2e 20 20 4f 72 20 69 66 20  s.** to.  Or if 
16c0: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  the argument is 
16d0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 72 65  the name of a re
16e0: 70 6f 73 69 74 6f 72 79 2c 20 73 68 6f 77 0a 2a  pository, show.*
16f0: 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * information ab
1700: 6f 75 74 20 74 68 61 74 20 72 65 70 6f 73 69 74  out that reposit
1710: 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ory..**.** If th
1720: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  e argument is a 
1730: 72 65 70 6f 73 69 74 6f 72 79 20 6e 61 6d 65 2c  repository name,
1740: 20 74 68 65 6e 20 74 68 65 20 2d 2d 76 65 72 62   then the --verb
1750: 6f 73 65 20 6f 70 74 69 6f 6e 20 73 68 6f 77 73  ose option shows
1760: 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 65 20 63 68  .** known the ch
1770: 65 63 6b 2d 6f 75 74 20 6c 6f 63 61 74 69 6f 6e  eck-out location
1780: 73 20 66 6f 72 20 74 68 61 74 20 72 65 70 6f 73  s for that repos
1790: 69 74 6f 72 79 20 61 6e 64 20 61 6c 6c 20 55 52  itory and all UR
17a0: 4c 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20 61 63  Ls used.** to ac
17b0: 63 65 73 73 20 74 68 65 20 72 65 70 6f 73 69 74  cess the reposit
17c0: 6f 72 79 2e 20 20 54 68 65 20 2d 2d 76 65 72 62  ory.  The --verb
17d0: 6f 73 65 20 69 73 20 28 63 75 72 72 65 6e 74 6c  ose is (currentl
17e0: 79 29 20 61 20 6e 6f 2d 6f 70 20 69 66 0a 2a 2a  y) a no-op if.**
17f0: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   the argument is
1800: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6f   the name of a o
1810: 62 6a 65 63 74 20 77 69 74 68 69 6e 20 74 68 65  bject within the
1820: 20 72 65 70 6f 73 69 74 6f 72 79 2e 0a 2a 2a 0a   repository..**.
1830: 2a 2a 20 55 73 65 20 74 68 65 20 22 66 69 6e 66  ** Use the "finf
1840: 6f 22 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 67 65  o" command to ge
1850: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  t information ab
1860: 6f 75 74 20 61 20 73 70 65 63 69 66 69 63 0a 2a  out a specific.*
1870: 2a 20 66 69 6c 65 20 69 6e 20 61 20 63 68 65 63  * file in a chec
1880: 6b 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 70 74 69  kout..**.** Opti
1890: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2d 52  ons:.**.**    -R
18a0: 7c 2d 2d 72 65 70 6f 73 69 74 6f 72 79 20 46 49  |--repository FI
18b0: 4c 45 20 20 20 20 20 20 20 45 78 74 72 61 63 74  LE       Extract
18c0: 20 69 6e 66 6f 20 66 72 6f 6d 20 72 65 70 6f 73   info from repos
18d0: 69 74 6f 72 79 20 46 49 4c 45 0a 2a 2a 20 20 20  itory FILE.**   
18e0: 20 2d 76 7c 2d 2d 76 65 72 62 6f 73 65 20 20 20   -v|--verbose   
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77              Show
1900: 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
1910: 6f 6e 20 61 62 6f 75 74 20 72 65 70 6f 73 69 74  on about reposit
1920: 6f 72 69 65 73 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ories.**.** See 
1930: 61 6c 73 6f 3a 20 61 6e 6e 6f 74 61 74 65 2c 20  also: annotate, 
1940: 61 72 74 69 66 61 63 74 2c 20 66 69 6e 66 6f 2c  artifact, finfo,
1950: 20 74 69 6d 65 6c 69 6e 65 0a 2a 2f 0a 76 6f 69   timeline.*/.voi
1960: 64 20 69 6e 66 6f 5f 63 6d 64 28 76 6f 69 64 29  d info_cmd(void)
1970: 7b 0a 20 20 69 36 34 20 66 73 69 7a 65 3b 0a 20  {.  i64 fsize;. 
1980: 20 69 6e 74 20 76 65 72 62 6f 73 65 46 6c 61 67   int verboseFlag
1990: 20 3d 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22   = find_option("
19a0: 76 65 72 62 6f 73 65 22 2c 22 76 22 2c 30 29 21  verbose","v",0)!
19b0: 3d 30 3b 0a 20 20 69 66 28 20 21 76 65 72 62 6f  =0;.  if( !verbo
19c0: 73 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 76 65  seFlag ){.    ve
19d0: 72 62 6f 73 65 46 6c 61 67 20 3d 20 66 69 6e 64  rboseFlag = find
19e0: 5f 6f 70 74 69 6f 6e 28 22 64 65 74 61 69 6c 22  _option("detail"
19f0: 2c 22 6c 22 2c 30 29 21 3d 30 3b 20 2f 2a 20 64  ,"l",0)!=0; /* d
1a00: 65 70 72 65 63 61 74 65 64 20 2a 2f 0a 20 20 7d  eprecated */.  }
1a10: 0a 0a 20 20 69 66 28 20 67 2e 61 72 67 63 3d 3d  ..  if( g.argc==
1a20: 33 0a 20 20 20 26 26 20 66 69 6c 65 5f 69 73 66  3.   && file_isf
1a30: 69 6c 65 28 67 2e 61 72 67 76 5b 32 5d 2c 20 45  ile(g.argv[2], E
1a40: 78 74 46 49 4c 45 29 0a 20 20 20 26 26 20 28 66  xtFILE).   && (f
1a50: 73 69 7a 65 20 3d 20 66 69 6c 65 5f 73 69 7a 65  size = file_size
1a60: 28 67 2e 61 72 67 76 5b 32 5d 2c 20 45 78 74 46  (g.argv[2], ExtF
1a70: 49 4c 45 29 29 3e 30 0a 20 20 20 26 26 20 28 66  ILE))>0.   && (f
1a80: 73 69 7a 65 26 30 78 31 66 66 29 3d 3d 30 0a 20  size&0x1ff)==0. 
1a90: 20 29 7b 0a 20 20 20 20 64 62 5f 6f 70 65 6e 5f   ){.    db_open_
1aa0: 63 6f 6e 66 69 67 28 30 2c 20 30 29 3b 0a 20 20  config(0, 0);.  
1ab0: 20 20 64 62 5f 6f 70 65 6e 5f 72 65 70 6f 73 69    db_open_reposi
1ac0: 74 6f 72 79 28 67 2e 61 72 67 76 5b 32 5d 29 3b  tory(g.argv[2]);
1ad0: 0a 20 20 20 20 64 62 5f 72 65 63 6f 72 64 5f 72  .    db_record_r
1ae0: 65 70 6f 73 69 74 6f 72 79 5f 66 69 6c 65 6e 61  epository_filena
1af0: 6d 65 28 67 2e 61 72 67 76 5b 32 5d 29 3b 0a 20  me(g.argv[2]);. 
1b00: 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28     fossil_print(
1b10: 22 70 72 6f 6a 65 63 74 2d 6e 61 6d 65 3a 20 25  "project-name: %
1b20: 73 5c 6e 22 2c 20 64 62 5f 67 65 74 28 22 70 72  s\n", db_get("pr
1b30: 6f 6a 65 63 74 2d 6e 61 6d 65 22 2c 20 22 3c 75  oject-name", "<u
1b40: 6e 6e 61 6d 65 64 3e 22 29 29 3b 0a 20 20 20 20  nnamed>"));.    
1b50: 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 70 72  fossil_print("pr
1b60: 6f 6a 65 63 74 2d 63 6f 64 65 3a 20 25 73 5c 6e  oject-code: %s\n
1b70: 22 2c 20 64 62 5f 67 65 74 28 22 70 72 6f 6a 65  ", db_get("proje
1b80: 63 74 2d 63 6f 64 65 22 2c 20 22 3c 6e 6f 6e 65  ct-code", "<none
1b90: 3e 22 29 29 3b 0a 20 20 20 20 73 68 6f 77 50 61  >"));.    showPa
1ba0: 72 65 6e 74 50 72 6f 6a 65 63 74 28 29 3b 0a 20  rentProject();. 
1bb0: 20 20 20 65 78 74 72 61 52 65 70 6f 49 6e 66 6f     extraRepoInfo
1bc0: 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ();.    return;.
1bd0: 20 20 7d 0a 20 20 64 62 5f 66 69 6e 64 5f 61 6e    }.  db_find_an
1be0: 64 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72  d_open_repositor
1bf0: 79 28 30 2c 30 29 3b 0a 20 20 76 65 72 69 66 79  y(0,0);.  verify
1c00: 5f 61 6c 6c 5f 6f 70 74 69 6f 6e 73 28 29 3b 0a  _all_options();.
1c10: 20 20 69 66 28 20 67 2e 61 72 67 63 3d 3d 32 20    if( g.argc==2 
1c20: 29 7b 0a 20 20 20 20 69 6e 74 20 76 69 64 3b 0a  ){.    int vid;.
1c30: 20 20 20 20 20 20 20 20 20 2f 2a 20 30 31 32 33           /* 0123
1c40: 34 35 36 37 38 39 30 31 32 33 34 20 2a 2f 0a 20  45678901234 */. 
1c50: 20 20 20 64 62 5f 72 65 63 6f 72 64 5f 72 65 70     db_record_rep
1c60: 6f 73 69 74 6f 72 79 5f 66 69 6c 65 6e 61 6d 65  ository_filename
1c70: 28 30 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f  (0);.    fossil_
1c80: 70 72 69 6e 74 28 22 70 72 6f 6a 65 63 74 2d 6e  print("project-n
1c90: 61 6d 65 3a 20 25 73 5c 6e 22 2c 20 64 62 5f 67  ame: %s\n", db_g
1ca0: 65 74 28 22 70 72 6f 6a 65 63 74 2d 6e 61 6d 65  et("project-name
1cb0: 22 2c 20 22 3c 75 6e 6e 61 6d 65 64 3e 22 29 29  ", "<unnamed>"))
1cc0: 3b 0a 20 20 20 20 69 66 28 20 67 2e 6c 6f 63 61  ;.    if( g.loca
1cd0: 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 66  lOpen ){.      f
1ce0: 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 72 65 70  ossil_print("rep
1cf0: 6f 73 69 74 6f 72 79 3a 20 20 20 25 73 5c 6e 22  ository:   %s\n"
1d00: 2c 20 64 62 5f 72 65 70 6f 73 69 74 6f 72 79 5f  , db_repository_
1d10: 66 69 6c 65 6e 61 6d 65 28 29 29 3b 0a 20 20 20  filename());.   
1d20: 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28     fossil_print(
1d30: 22 6c 6f 63 61 6c 2d 72 6f 6f 74 3a 20 20 20 25  "local-root:   %
1d40: 73 5c 6e 22 2c 20 67 2e 7a 4c 6f 63 61 6c 52 6f  s\n", g.zLocalRo
1d50: 6f 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ot);.    }.    i
1d60: 66 28 20 76 65 72 62 6f 73 65 46 6c 61 67 20 29  f( verboseFlag )
1d70: 20 65 78 74 72 61 52 65 70 6f 49 6e 66 6f 28 29   extraRepoInfo()
1d80: 3b 0a 20 20 20 20 69 66 28 20 67 2e 7a 43 6f 6e  ;.    if( g.zCon
1d90: 66 69 67 44 62 4e 61 6d 65 20 29 7b 0a 20 20 20  figDbName ){.   
1da0: 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28     fossil_print(
1db0: 22 63 6f 6e 66 69 67 2d 64 62 3a 20 20 20 20 25  "config-db:    %
1dc0: 73 5c 6e 22 2c 20 67 2e 7a 43 6f 6e 66 69 67 44  s\n", g.zConfigD
1dd0: 62 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  bName);.    }.  
1de0: 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22    fossil_print("
1df0: 70 72 6f 6a 65 63 74 2d 63 6f 64 65 3a 20 25 73  project-code: %s
1e00: 5c 6e 22 2c 20 64 62 5f 67 65 74 28 22 70 72 6f  \n", db_get("pro
1e10: 6a 65 63 74 2d 63 6f 64 65 22 2c 20 22 22 29 29  ject-code", ""))
1e20: 3b 0a 20 20 20 20 73 68 6f 77 50 61 72 65 6e 74  ;.    showParent
1e30: 50 72 6f 6a 65 63 74 28 29 3b 0a 20 20 20 20 76  Project();.    v
1e40: 69 64 20 3d 20 67 2e 6c 6f 63 61 6c 4f 70 65 6e  id = g.localOpen
1e50: 20 3f 20 64 62 5f 6c 67 65 74 5f 69 6e 74 28 22   ? db_lget_int("
1e60: 63 68 65 63 6b 6f 75 74 22 2c 20 30 29 20 3a 20  checkout", 0) : 
1e70: 30 3b 0a 20 20 20 20 69 66 28 20 76 69 64 20 29  0;.    if( vid )
1e80: 7b 0a 20 20 20 20 20 20 73 68 6f 77 5f 63 6f 6d  {.      show_com
1e90: 6d 6f 6e 5f 69 6e 66 6f 28 76 69 64 2c 20 22 63  mon_info(vid, "c
1ea0: 68 65 63 6b 6f 75 74 3a 22 2c 20 31 2c 20 31 29  heckout:", 1, 1)
1eb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 73 73  ;.    }.    foss
1ec0: 69 6c 5f 70 72 69 6e 74 28 22 63 68 65 63 6b 2d  il_print("check-
1ed0: 69 6e 73 3a 20 20 20 20 25 64 5c 6e 22 2c 0a 20  ins:    %d\n",. 
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 5f 69              db_i
1ef0: 6e 74 28 2d 31 2c 20 22 53 45 4c 45 43 54 20 63  nt(-1, "SELECT c
1f00: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 65 76 65  ount(*) FROM eve
1f10: 6e 74 20 57 48 45 52 45 20 74 79 70 65 3d 27 63  nt WHERE type='c
1f20: 69 27 20 2f 2a 73 63 61 6e 2a 2f 22 29 29 3b 0a  i' /*scan*/"));.
1f30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1f40: 20 72 69 64 3b 0a 20 20 20 20 72 69 64 20 3d 20   rid;.    rid = 
1f50: 6e 61 6d 65 5f 74 6f 5f 72 69 64 28 67 2e 61 72  name_to_rid(g.ar
1f60: 67 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  gv[2]);.    if( 
1f70: 72 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rid==0 ){.      
1f80: 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 6e 6f  fossil_fatal("no
1f90: 20 73 75 63 68 20 6f 62 6a 65 63 74 3a 20 25 73   such object: %s
1fa0: 22 2c 20 67 2e 61 72 67 76 5b 32 5d 29 3b 0a 20  ", g.argv[2]);. 
1fb0: 20 20 20 7d 0a 20 20 20 20 73 68 6f 77 5f 63 6f     }.    show_co
1fc0: 6d 6d 6f 6e 5f 69 6e 66 6f 28 72 69 64 2c 20 22  mmon_info(rid, "
1fd0: 75 75 69 64 3a 22 2c 20 31 2c 20 31 29 3b 0a 20  uuid:", 1, 1);. 
1fe0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 6f 77   }.}../*.** Show
1ff0: 20 74 68 65 20 63 6f 6e 74 65 78 74 20 67 72 61   the context gra
2000: 70 68 20 28 69 6d 6d 65 64 69 61 74 65 20 70 61  ph (immediate pa
2010: 72 65 6e 74 73 20 61 6e 64 20 63 68 69 6c 64 72  rents and childr
2020: 65 6e 29 20 66 6f 72 0a 2a 2a 20 63 68 65 63 6b  en) for.** check
2030: 2d 69 6e 20 72 69 64 2e 0a 2a 2f 0a 76 6f 69 64  -in rid..*/.void
2040: 20 72 65 6e 64 65 72 5f 63 68 65 63 6b 69 6e 5f   render_checkin_
2050: 63 6f 6e 74 65 78 74 28 69 6e 74 20 72 69 64 2c  context(int rid,
2060: 20 69 6e 74 20 70 61 72 65 6e 74 73 4f 6e 6c 79   int parentsOnly
2070: 29 7b 0a 20 20 42 6c 6f 62 20 73 71 6c 3b 0a 20  ){.  Blob sql;. 
2080: 20 53 74 6d 74 20 71 3b 0a 20 20 62 6c 6f 62 5f   Stmt q;.  blob_
2090: 7a 65 72 6f 28 26 73 71 6c 29 3b 0a 20 20 62 6c  zero(&sql);.  bl
20a0: 6f 62 5f 61 70 70 65 6e 64 28 26 73 71 6c 2c 20  ob_append(&sql, 
20b0: 74 69 6d 65 6c 69 6e 65 5f 71 75 65 72 79 5f 66  timeline_query_f
20c0: 6f 72 5f 77 77 77 28 29 2c 20 2d 31 29 3b 0a 20  or_www(), -1);. 
20d0: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a   db_multi_exec(.
20e0: 20 20 20 20 20 22 43 52 45 41 54 45 20 54 45 4d       "CREATE TEM
20f0: 50 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  P TABLE IF NOT E
2100: 58 49 53 54 53 20 6f 6b 28 72 69 64 20 49 4e 54  XISTS ok(rid INT
2110: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
2120: 29 3b 22 0a 20 20 20 20 20 22 44 45 4c 45 54 45  );".     "DELETE
2130: 20 46 52 4f 4d 20 6f 6b 3b 22 0a 20 20 20 20 20   FROM ok;".     
2140: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f 6b 20  "INSERT INTO ok 
2150: 56 41 4c 55 45 53 28 25 64 29 3b 22 0a 20 20 20  VALUES(%d);".   
2160: 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e    "INSERT OR IGN
2170: 4f 52 45 20 49 4e 54 4f 20 6f 6b 20 53 45 4c 45  ORE INTO ok SELE
2180: 43 54 20 70 69 64 20 46 52 4f 4d 20 70 6c 69 6e  CT pid FROM plin
2190: 6b 20 57 48 45 52 45 20 63 69 64 3d 25 64 3b 22  k WHERE cid=%d;"
21a0: 2c 0a 20 20 20 20 20 72 69 64 2c 20 72 69 64 0a  ,.     rid, rid.
21b0: 20 20 29 3b 0a 20 20 69 66 28 20 21 70 61 72 65    );.  if( !pare
21c0: 6e 74 73 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 64  ntsOnly ){.    d
21d0: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20  b_multi_exec(.  
21e0: 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49      "INSERT OR I
21f0: 47 4e 4f 52 45 20 49 4e 54 4f 20 6f 6b 20 53 45  GNORE INTO ok SE
2200: 4c 45 43 54 20 63 69 64 20 46 52 4f 4d 20 70 6c  LECT cid FROM pl
2210: 69 6e 6b 20 57 48 45 52 45 20 70 69 64 3d 25 64  ink WHERE pid=%d
2220: 3b 22 2c 20 72 69 64 0a 20 20 20 20 29 3b 0a 20  ;", rid.    );. 
2230: 20 20 20 69 66 28 20 64 62 5f 74 61 62 6c 65 5f     if( db_table_
2240: 65 78 69 73 74 73 28 22 72 65 70 6f 73 69 74 6f  exists("reposito
2250: 72 79 22 2c 22 63 68 65 72 72 79 70 69 63 6b 22  ry","cherrypick"
2260: 29 20 29 7b 0a 20 20 20 20 20 20 64 62 5f 6d 75  ) ){.      db_mu
2270: 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20 20  lti_exec(.      
2280: 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e    "INSERT OR IGN
2290: 4f 52 45 20 49 4e 54 4f 20 6f 6b 20 22 0a 20 20  ORE INTO ok ".  
22a0: 20 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 20        "  SELECT 
22b0: 70 61 72 65 6e 74 69 64 20 46 52 4f 4d 20 63 68  parentid FROM ch
22c0: 65 72 72 79 70 69 63 6b 20 57 48 45 52 45 20 63  errypick WHERE c
22d0: 68 69 6c 64 69 64 3d 25 64 3b 22 0a 20 20 20 20  hildid=%d;".    
22e0: 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49      "INSERT OR I
22f0: 47 4e 4f 52 45 20 49 4e 54 4f 20 6f 6b 20 22 0a  GNORE INTO ok ".
2300: 20 20 20 20 20 20 20 20 22 20 20 53 45 4c 45 43          "  SELEC
2310: 54 20 63 68 69 6c 64 69 64 20 46 52 4f 4d 20 63  T childid FROM c
2320: 68 65 72 72 79 70 69 63 6b 20 57 48 45 52 45 20  herrypick WHERE 
2330: 70 61 72 65 6e 74 69 64 3d 25 64 3b 22 2c 0a 20  parentid=%d;",. 
2340: 20 20 20 20 20 20 20 72 69 64 2c 20 72 69 64 0a         rid, rid.
2350: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
2360: 20 7d 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64   }.  blob_append
2370: 5f 73 71 6c 28 26 73 71 6c 2c 20 22 20 41 4e 44  _sql(&sql, " AND
2380: 20 65 76 65 6e 74 2e 6f 62 6a 69 64 20 49 4e 20   event.objid IN 
2390: 6f 6b 20 4f 52 44 45 52 20 42 59 20 6d 74 69 6d  ok ORDER BY mtim
23a0: 65 20 44 45 53 43 22 29 3b 0a 20 20 64 62 5f 70  e DESC");.  db_p
23b0: 72 65 70 61 72 65 28 26 71 2c 20 22 25 73 22 2c  repare(&q, "%s",
23c0: 20 62 6c 6f 62 5f 73 71 6c 5f 74 65 78 74 28 26   blob_sql_text(&
23d0: 73 71 6c 29 29 3b 0a 20 20 77 77 77 5f 70 72 69  sql));.  www_pri
23e0: 6e 74 5f 74 69 6d 65 6c 69 6e 65 28 26 71 2c 0a  nt_timeline(&q,.
23f0: 20 20 20 20 20 20 20 54 49 4d 45 4c 49 4e 45 5f         TIMELINE_
2400: 44 49 53 4a 4f 49 4e 54 0a 20 20 20 20 20 20 20  DISJOINT.       
2410: 20 20 7c 54 49 4d 45 4c 49 4e 45 5f 47 52 41 50    |TIMELINE_GRAP
2420: 48 0a 20 20 20 20 20 20 20 20 20 7c 54 49 4d 45  H.         |TIME
2430: 4c 49 4e 45 5f 4e 4f 53 43 52 4f 4c 4c 0a 20 20  LINE_NOSCROLL.  
2440: 20 20 20 20 20 20 20 7c 54 49 4d 45 4c 49 4e 45         |TIMELINE
2450: 5f 43 48 50 49 43 4b 2c 0a 20 20 20 20 20 20 20  _CHPICK,.       
2460: 30 2c 20 30 2c 20 72 69 64 2c 20 30 29 3b 0a 20  0, 0, rid, 0);. 
2470: 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29   db_finalize(&q)
2480: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 6f 77 20  ;.}../*.** Show 
2490: 61 20 67 72 61 70 68 20 61 6c 6c 20 77 69 6b 69  a graph all wiki
24a0: 2c 20 74 69 63 6b 65 74 73 2c 20 61 6e 64 20 63  , tickets, and c
24b0: 68 65 63 6b 2d 69 6e 73 20 74 68 61 74 20 72 65  heck-ins that re
24c0: 66 65 72 20 74 6f 20 6f 62 6a 65 63 74 20 7a 55  fer to object zU
24d0: 75 69 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4c  uid..**.** If zL
24e0: 61 62 65 6c 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  abel is not NULL
24f0: 20 61 6e 64 20 74 68 65 20 67 72 61 70 68 20 69   and the graph i
2500: 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68 65  s not empty, the
2510: 6e 20 6f 75 74 70 75 74 20 7a 4c 61 62 65 6c 20  n output zLabel 
2520: 61 73 0a 2a 2a 20 61 20 70 72 65 66 69 78 20 74  as.** a prefix t
2530: 6f 20 74 68 65 20 67 72 61 70 68 2e 0a 2a 2f 0a  o the graph..*/.
2540: 76 6f 69 64 20 72 65 6e 64 65 72 5f 62 61 63 6b  void render_back
2550: 6c 69 6e 6b 5f 67 72 61 70 68 28 63 6f 6e 73 74  link_graph(const
2560: 20 63 68 61 72 20 2a 7a 55 75 69 64 2c 20 63 6f   char *zUuid, co
2570: 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c  nst char *zLabel
2580: 29 7b 0a 20 20 42 6c 6f 62 20 73 71 6c 3b 0a 20  ){.  Blob sql;. 
2590: 20 53 74 6d 74 20 71 3b 0a 20 20 63 68 61 72 20   Stmt q;.  char 
25a0: 2a 7a 47 6c 6f 62 3b 0a 20 20 7a 47 6c 6f 62 20  *zGlob;.  zGlob 
25b0: 3d 20 6d 70 72 69 6e 74 66 28 22 25 2e 35 73 2a  = mprintf("%.5s*
25c0: 22 2c 20 7a 55 75 69 64 29 3b 0a 20 20 64 62 5f  ", zUuid);.  db_
25d0: 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20  multi_exec(.    
25e0: 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41   "CREATE TEMP TA
25f0: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
2600: 53 20 6f 6b 28 72 69 64 20 49 4e 54 45 47 45 52  S ok(rid INTEGER
2610: 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 22 0a   PRIMARY KEY);".
2620: 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
2630: 4d 20 6f 6b 3b 22 0a 20 20 20 20 20 22 49 4e 53  M ok;".     "INS
2640: 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e  ERT OR IGNORE IN
2650: 54 4f 20 6f 6b 22 0a 20 20 20 20 20 22 20 53 45  TO ok".     " SE
2660: 4c 45 43 54 20 73 72 63 69 64 20 46 52 4f 4d 20  LECT srcid FROM 
2670: 62 61 63 6b 6c 69 6e 6b 22 0a 20 20 20 20 20 22  backlink".     "
2680: 20 20 57 48 45 52 45 20 74 61 72 67 65 74 20 47    WHERE target G
2690: 4c 4f 42 20 25 51 22 0a 20 20 20 20 20 22 20 20  LOB %Q".     "  
26a0: 20 20 41 4e 44 20 25 51 20 47 4c 4f 42 20 28 74    AND %Q GLOB (t
26b0: 61 72 67 65 74 20 7c 7c 20 27 2a 27 29 3b 22 2c  arget || '*');",
26c0: 0a 20 20 20 20 20 7a 47 6c 6f 62 2c 20 7a 55 75  .     zGlob, zUu
26d0: 69 64 0a 20 20 29 3b 0a 20 20 69 66 28 20 21 64  id.  );.  if( !d
26e0: 62 5f 65 78 69 73 74 73 28 22 53 45 4c 45 43 54  b_exists("SELECT
26f0: 20 31 20 46 52 4f 4d 20 6f 6b 22 29 20 29 20 72   1 FROM ok") ) r
2700: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 7a 4c 61  eturn;.  if( zLa
2710: 62 65 6c 20 29 20 63 67 69 5f 70 72 69 6e 74 66  bel ) cgi_printf
2720: 28 22 25 73 22 2c 20 7a 4c 61 62 65 6c 29 3b 0a  ("%s", zLabel);.
2730: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 73 71 6c    blob_zero(&sql
2740: 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64  );.  blob_append
2750: 28 26 73 71 6c 2c 20 74 69 6d 65 6c 69 6e 65 5f  (&sql, timeline_
2760: 71 75 65 72 79 5f 66 6f 72 5f 77 77 77 28 29 2c  query_for_www(),
2770: 20 2d 31 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70   -1);.  blob_app
2780: 65 6e 64 5f 73 71 6c 28 26 73 71 6c 2c 20 22 20  end_sql(&sql, " 
2790: 41 4e 44 20 65 76 65 6e 74 2e 6f 62 6a 69 64 20  AND event.objid 
27a0: 49 4e 20 6f 6b 20 4f 52 44 45 52 20 42 59 20 6d  IN ok ORDER BY m
27b0: 74 69 6d 65 20 44 45 53 43 22 29 3b 0a 20 20 64  time DESC");.  d
27c0: 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 22 25  b_prepare(&q, "%
27d0: 73 22 2c 20 62 6c 6f 62 5f 73 71 6c 5f 74 65 78  s", blob_sql_tex
27e0: 74 28 26 73 71 6c 29 29 3b 0a 20 20 77 77 77 5f  t(&sql));.  www_
27f0: 70 72 69 6e 74 5f 74 69 6d 65 6c 69 6e 65 28 26  print_timeline(&
2800: 71 2c 20 54 49 4d 45 4c 49 4e 45 5f 44 49 53 4a  q, TIMELINE_DISJ
2810: 4f 49 4e 54 7c 54 49 4d 45 4c 49 4e 45 5f 47 52  OINT|TIMELINE_GR
2820: 41 50 48 7c 54 49 4d 45 4c 49 4e 45 5f 4e 4f 53  APH|TIMELINE_NOS
2830: 43 52 4f 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20  CROLL,.         
2840: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
2850: 2c 20 30 2c 20 30 29 3b 0a 20 20 64 62 5f 66 69  , 0, 0);.  db_fi
2860: 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 7d 0a 0a 2f  nalize(&q);.}../
2870: 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 74 65  *.** WEBPAGE: te
2880: 73 74 2d 62 61 63 6b 6c 69 6e 6b 73 0a 2a 2a 0a  st-backlinks.**.
2890: 2a 2a 20 53 68 6f 77 20 61 20 74 69 6d 65 6c 69  ** Show a timeli
28a0: 6e 65 20 6f 66 20 61 6c 6c 20 63 68 65 63 6b 2d  ne of all check-
28b0: 69 6e 73 20 61 6e 64 20 6f 74 68 65 72 20 65 76  ins and other ev
28c0: 65 6e 74 73 20 74 68 61 74 20 68 61 76 65 20 65  ents that have e
28d0: 6e 74 72 69 65 73 0a 2a 2a 20 69 6e 20 74 68 65  ntries.** in the
28e0: 20 62 61 63 6b 6c 69 6e 6b 20 74 61 62 6c 65 2e   backlink table.
28f0: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
2900: 6f 72 20 74 65 73 74 69 6e 67 20 74 68 65 20 72  or testing the r
2910: 65 6e 64 65 72 69 6e 67 0a 2a 2a 20 6f 66 20 74  endering.** of t
2920: 68 65 20 22 52 65 66 65 72 65 6e 63 65 73 22 20  he "References" 
2930: 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 2f  section of the /
2940: 69 6e 66 6f 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  info page..*/.vo
2950: 69 64 20 62 61 63 6b 6c 69 6e 6b 5f 74 69 6d 65  id backlink_time
2960: 6c 69 6e 65 5f 70 61 67 65 28 76 6f 69 64 29 7b  line_page(void){
2970: 0a 20 20 42 6c 6f 62 20 73 71 6c 3b 0a 20 20 53  .  Blob sql;.  S
2980: 74 6d 74 20 71 3b 0a 0a 20 20 6c 6f 67 69 6e 5f  tmt q;..  login_
2990: 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c  check_credential
29a0: 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 70 65  s();.  if( !g.pe
29b0: 72 6d 2e 52 65 61 64 20 7c 7c 20 21 67 2e 70 65  rm.Read || !g.pe
29c0: 72 6d 2e 52 64 54 6b 74 20 7c 7c 20 21 67 2e 70  rm.RdTkt || !g.p
29d0: 65 72 6d 2e 52 64 57 69 6b 69 20 29 7b 0a 20 20  erm.RdWiki ){.  
29e0: 20 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 67    login_needed(g
29f0: 2e 61 6e 6f 6e 2e 52 65 61 64 20 26 26 20 67 2e  .anon.Read && g.
2a00: 61 6e 6f 6e 2e 52 64 54 6b 74 20 26 26 20 67 2e  anon.RdTkt && g.
2a10: 61 6e 6f 6e 2e 52 64 57 69 6b 69 29 3b 0a 20 20  anon.RdWiki);.  
2a20: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
2a30: 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22 42 61  style_header("Ba
2a40: 63 6b 6c 69 6e 6b 20 54 69 6d 65 6c 69 6e 65 20  cklink Timeline 
2a50: 28 49 6e 74 65 72 6e 61 6c 20 54 65 73 74 69 6e  (Internal Testin
2a60: 67 20 55 73 65 29 22 29 3b 0a 20 20 64 62 5f 6d  g Use)");.  db_m
2a70: 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20  ulti_exec(.     
2a80: 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42  "CREATE TEMP TAB
2a90: 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53  LE IF NOT EXISTS
2aa0: 20 6f 6b 28 72 69 64 20 49 4e 54 45 47 45 52 20   ok(rid INTEGER 
2ab0: 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 22 0a 20  PRIMARY KEY);". 
2ac0: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
2ad0: 20 6f 6b 3b 22 0a 20 20 20 20 20 22 49 4e 53 45   ok;".     "INSE
2ae0: 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
2af0: 4f 20 6f 6b 22 0a 20 20 20 20 20 22 20 53 45 4c  O ok".     " SEL
2b00: 45 43 54 20 62 6c 6f 62 2e 72 69 64 20 46 52 4f  ECT blob.rid FRO
2b10: 4d 20 62 61 63 6b 6c 69 6e 6b 2c 20 62 6c 6f 62  M backlink, blob
2b20: 22 0a 20 20 20 20 20 22 20 20 57 48 45 52 45 20  ".     "  WHERE 
2b30: 62 6c 6f 62 2e 75 75 69 64 20 42 45 54 57 45 45  blob.uuid BETWEE
2b40: 4e 20 62 61 63 6b 6c 69 6e 6b 2e 74 61 72 67 65  N backlink.targe
2b50: 74 20 41 4e 44 20 28 62 61 63 6b 6c 69 6e 6b 2e  t AND (backlink.
2b60: 74 61 72 67 65 74 7c 7c 27 78 27 29 22 0a 20 20  target||'x')".  
2b70: 29 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26  );.  blob_zero(&
2b80: 73 71 6c 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70  sql);.  blob_app
2b90: 65 6e 64 28 26 73 71 6c 2c 20 74 69 6d 65 6c 69  end(&sql, timeli
2ba0: 6e 65 5f 71 75 65 72 79 5f 66 6f 72 5f 77 77 77  ne_query_for_www
2bb0: 28 29 2c 20 2d 31 29 3b 0a 20 20 62 6c 6f 62 5f  (), -1);.  blob_
2bc0: 61 70 70 65 6e 64 5f 73 71 6c 28 26 73 71 6c 2c  append_sql(&sql,
2bd0: 20 22 20 41 4e 44 20 65 76 65 6e 74 2e 6f 62 6a   " AND event.obj
2be0: 69 64 20 49 4e 20 6f 6b 20 4f 52 44 45 52 20 42  id IN ok ORDER B
2bf0: 59 20 6d 74 69 6d 65 20 44 45 53 43 22 29 3b 0a  Y mtime DESC");.
2c00: 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c    db_prepare(&q,
2c10: 20 22 25 73 22 2c 20 62 6c 6f 62 5f 73 71 6c 5f   "%s", blob_sql_
2c20: 74 65 78 74 28 26 73 71 6c 29 29 3b 0a 20 20 77  text(&sql));.  w
2c30: 77 77 5f 70 72 69 6e 74 5f 74 69 6d 65 6c 69 6e  ww_print_timelin
2c40: 65 28 26 71 2c 20 54 49 4d 45 4c 49 4e 45 5f 44  e(&q, TIMELINE_D
2c50: 49 53 4a 4f 49 4e 54 7c 54 49 4d 45 4c 49 4e 45  ISJOINT|TIMELINE
2c60: 5f 47 52 41 50 48 7c 54 49 4d 45 4c 49 4e 45 5f  _GRAPH|TIMELINE_
2c70: 4e 4f 53 43 52 4f 4c 4c 2c 0a 20 20 20 20 20 20  NOSCROLL,.      
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
2c90: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 64 62  , 0, 0, 0);.  db
2ca0: 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20  _finalize(&q);. 
2cb0: 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b   style_footer();
2cc0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  .}.../*.** Appen
2cd0: 64 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  d the difference
2ce0: 20 62 65 74 77 65 65 6e 20 61 72 74 69 66 61 63   between artifac
2cf0: 74 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ts to the output
2d00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2d10: 61 70 70 65 6e 64 5f 64 69 66 66 28 0a 20 20 63  append_diff(.  c
2d20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 72 6f 6d  onst char *zFrom
2d30: 2c 20 20 20 20 2f 2a 20 44 69 66 66 20 66 72 6f  ,    /* Diff fro
2d40: 6d 20 74 68 69 73 20 61 72 74 69 66 61 63 74 20  m this artifact 
2d50: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2d60: 2a 7a 54 6f 2c 20 20 20 20 20 20 2f 2a 20 20 2e  *zTo,      /*  .
2d70: 2e 2e 20 74 6f 20 74 68 69 73 20 61 72 74 69 66  .. to this artif
2d80: 61 63 74 20 2a 2f 0a 20 20 75 36 34 20 64 69 66  act */.  u64 dif
2d90: 66 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 2f  fFlags,        /
2da0: 2a 20 44 69 66 66 20 66 6f 72 6d 61 74 74 69 6e  * Diff formattin
2db0: 67 20 66 6c 61 67 73 20 2a 2f 0a 20 20 52 65 43  g flags */.  ReC
2dc0: 6f 6d 70 69 6c 65 64 20 2a 70 52 65 20 20 20 20  ompiled *pRe    
2dd0: 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 68 6f 77 20     /* Only show 
2de0: 63 68 61 6e 67 65 20 6d 61 74 63 68 69 6e 67 20  change matching 
2df0: 74 68 69 73 20 72 65 67 65 78 20 2a 2f 0a 29 7b  this regex */.){
2e00: 0a 20 20 69 6e 74 20 66 72 6f 6d 69 64 3b 0a 20  .  int fromid;. 
2e10: 20 69 6e 74 20 74 6f 69 64 3b 0a 20 20 42 6c 6f   int toid;.  Blo
2e20: 62 20 66 72 6f 6d 2c 20 74 6f 2c 20 6f 75 74 3b  b from, to, out;
2e30: 0a 20 20 69 66 28 20 7a 46 72 6f 6d 20 29 7b 0a  .  if( zFrom ){.
2e40: 20 20 20 20 66 72 6f 6d 69 64 20 3d 20 75 75 69      fromid = uui
2e50: 64 5f 74 6f 5f 72 69 64 28 7a 46 72 6f 6d 2c 20  d_to_rid(zFrom, 
2e60: 30 29 3b 0a 20 20 20 20 63 6f 6e 74 65 6e 74 5f  0);.    content_
2e70: 67 65 74 28 66 72 6f 6d 69 64 2c 20 26 66 72 6f  get(fromid, &fro
2e80: 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  m);.  }else{.   
2e90: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 66 72 6f 6d   blob_zero(&from
2ea0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 6f  );.  }.  if( zTo
2eb0: 20 29 7b 0a 20 20 20 20 74 6f 69 64 20 3d 20 75   ){.    toid = u
2ec0: 75 69 64 5f 74 6f 5f 72 69 64 28 7a 54 6f 2c 20  uid_to_rid(zTo, 
2ed0: 30 29 3b 0a 20 20 20 20 63 6f 6e 74 65 6e 74 5f  0);.    content_
2ee0: 67 65 74 28 74 6f 69 64 2c 20 26 74 6f 29 3b 0a  get(toid, &to);.
2ef0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 6c 6f    }else{.    blo
2f00: 62 5f 7a 65 72 6f 28 26 74 6f 29 3b 0a 20 20 7d  b_zero(&to);.  }
2f10: 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 6f 75  .  blob_zero(&ou
2f20: 74 29 3b 0a 20 20 69 66 28 20 64 69 66 66 46 6c  t);.  if( diffFl
2f30: 61 67 73 20 26 20 44 49 46 46 5f 53 49 44 45 42  ags & DIFF_SIDEB
2f40: 59 53 49 44 45 20 29 7b 0a 20 20 20 20 74 65 78  YSIDE ){.    tex
2f50: 74 5f 64 69 66 66 28 26 66 72 6f 6d 2c 20 26 74  t_diff(&from, &t
2f60: 6f 2c 20 26 6f 75 74 2c 20 70 52 65 2c 20 64 69  o, &out, pRe, di
2f70: 66 66 46 6c 61 67 73 20 7c 20 44 49 46 46 5f 48  ffFlags | DIFF_H
2f80: 54 4d 4c 20 7c 20 44 49 46 46 5f 4e 4f 54 54 4f  TML | DIFF_NOTTO
2f90: 4f 42 49 47 29 3b 0a 20 20 20 20 40 20 25 73 28  OBIG);.    @ %s(
2fa0: 62 6c 6f 62 5f 73 74 72 28 26 6f 75 74 29 29 0a  blob_str(&out)).
2fb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 65 78    }else{.    tex
2fc0: 74 5f 64 69 66 66 28 26 66 72 6f 6d 2c 20 26 74  t_diff(&from, &t
2fd0: 6f 2c 20 26 6f 75 74 2c 20 70 52 65 2c 0a 20 20  o, &out, pRe,.  
2fe0: 20 20 20 20 20 20 20 20 20 64 69 66 66 46 6c 61           diffFla
2ff0: 67 73 20 7c 20 44 49 46 46 5f 4c 49 4e 45 4e 4f  gs | DIFF_LINENO
3000: 20 7c 20 44 49 46 46 5f 48 54 4d 4c 20 7c 20 44   | DIFF_HTML | D
3010: 49 46 46 5f 4e 4f 54 54 4f 4f 42 49 47 29 3b 0a  IFF_NOTTOOBIG);.
3020: 20 20 20 20 40 20 3c 70 72 65 20 63 6c 61 73 73      @ <pre class
3030: 3d 22 75 64 69 66 66 22 3e 0a 20 20 20 20 40 20  ="udiff">.    @ 
3040: 25 73 28 62 6c 6f 62 5f 73 74 72 28 26 6f 75 74  %s(blob_str(&out
3050: 29 29 0a 20 20 20 20 40 20 3c 2f 70 72 65 3e 0a  )).    @ </pre>.
3060: 20 20 7d 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74    }.  blob_reset
3070: 28 26 66 72 6f 6d 29 3b 0a 20 20 62 6c 6f 62 5f  (&from);.  blob_
3080: 72 65 73 65 74 28 26 74 6f 29 3b 0a 20 20 62 6c  reset(&to);.  bl
3090: 6f 62 5f 72 65 73 65 74 28 26 6f 75 74 29 3b 0a  ob_reset(&out);.
30a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
30b0: 20 6c 69 6e 65 20 6f 66 20 77 65 62 2d 70 61 67   line of web-pag
30c0: 65 20 6f 75 74 70 75 74 20 74 68 61 74 20 73 68  e output that sh
30d0: 6f 77 73 20 63 68 61 6e 67 65 73 20 74 68 61 74  ows changes that
30e0: 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 0a 2a   have occurred.*
30f0: 2a 20 74 6f 20 61 20 66 69 6c 65 20 62 65 74 77  * to a file betw
3100: 65 65 6e 20 74 77 6f 20 63 68 65 63 6b 2d 69 6e  een two check-in
3110: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
3120: 64 20 61 70 70 65 6e 64 5f 66 69 6c 65 5f 63 68  d append_file_ch
3130: 61 6e 67 65 5f 6c 69 6e 65 28 0a 20 20 63 6f 6e  ange_line(.  con
3140: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
3150: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
3160: 65 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20  e file that has 
3170: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 63 6f 6e  changed */.  con
3180: 73 74 20 63 68 61 72 20 2a 7a 4f 6c 64 2c 20 20  st char *zOld,  
3190: 20 20 20 2f 2a 20 62 6c 6f 62 2e 75 75 69 64 20     /* blob.uuid 
31a0: 62 65 66 6f 72 65 20 63 68 61 6e 67 65 2e 20 20  before change.  
31b0: 4e 55 4c 4c 20 66 6f 72 20 61 64 64 65 64 20 66  NULL for added f
31c0: 69 6c 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  iles */.  const 
31d0: 63 68 61 72 20 2a 7a 4e 65 77 2c 20 20 20 20 20  char *zNew,     
31e0: 2f 2a 20 62 6c 6f 62 2e 75 75 69 64 20 61 66 74  /* blob.uuid aft
31f0: 65 72 20 63 68 61 6e 67 65 2e 20 20 4e 55 4c 4c  er change.  NULL
3200: 20 66 6f 72 20 64 65 6c 65 74 65 73 20 2a 2f 0a   for deletes */.
3210: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
3220: 6c 64 4e 61 6d 65 2c 20 2f 2a 20 50 72 69 6f 72  ldName, /* Prior
3230: 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 66 20   name.  NULL if 
3240: 6e 6f 20 6e 61 6d 65 20 63 68 61 6e 67 65 2e 20  no name change. 
3250: 2a 2f 0a 20 20 75 36 34 20 64 69 66 66 46 6c 61  */.  u64 diffFla
3260: 67 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  gs,        /* Fl
3270: 61 67 73 20 66 6f 72 20 74 65 78 74 5f 64 69 66  ags for text_dif
3280: 66 28 29 2e 20 20 5a 65 72 6f 20 74 6f 20 6f 6d  f().  Zero to om
3290: 69 74 20 64 69 66 66 73 20 2a 2f 0a 20 20 52 65  it diffs */.  Re
32a0: 43 6f 6d 70 69 6c 65 64 20 2a 70 52 65 2c 20 20  Compiled *pRe,  
32b0: 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 68 6f 77      /* Only show
32c0: 20 64 69 66 66 73 20 74 68 61 74 20 6d 61 74 63   diffs that matc
32d0: 68 20 74 68 69 73 20 72 65 67 65 78 2c 20 69 66  h this regex, if
32e0: 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69   not NULL */.  i
32f0: 6e 74 20 6d 70 65 72 6d 20 20 20 20 20 20 20 20  nt mperm        
3300: 20 20 20 20 20 2f 2a 20 65 78 65 63 75 74 61 62       /* executab
3310: 6c 65 20 6f 72 20 73 79 6d 6c 69 6e 6b 20 70 65  le or symlink pe
3320: 72 6d 69 73 73 69 6f 6e 20 66 6f 72 20 7a 4e 65  rmission for zNe
3330: 77 20 2a 2f 0a 29 7b 0a 20 20 40 20 3c 70 3e 0a  w */.){.  @ <p>.
3340: 20 20 69 66 28 20 21 67 2e 70 65 72 6d 2e 48 79    if( !g.perm.Hy
3350: 70 65 72 6c 69 6e 6b 20 29 7b 0a 20 20 20 20 69  perlink ){.    i
3360: 66 28 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( zNew==0 ){.  
3370: 20 20 20 20 40 20 44 65 6c 65 74 65 64 20 25 68      @ Deleted %h
3380: 28 7a 4e 61 6d 65 29 2e 0a 20 20 20 20 7d 65 6c  (zName)..    }el
3390: 73 65 20 69 66 28 20 7a 4f 6c 64 3d 3d 30 20 29  se if( zOld==0 )
33a0: 7b 0a 20 20 20 20 20 20 40 20 41 64 64 65 64 20  {.      @ Added 
33b0: 25 68 28 7a 4e 61 6d 65 29 2e 0a 20 20 20 20 7d  %h(zName)..    }
33c0: 65 6c 73 65 20 69 66 28 20 7a 4f 6c 64 4e 61 6d  else if( zOldNam
33d0: 65 21 3d 30 20 26 26 20 66 6f 73 73 69 6c 5f 73  e!=0 && fossil_s
33e0: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 7a 4f 6c 64  trcmp(zName,zOld
33f0: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
3400: 20 20 40 20 4e 61 6d 65 20 63 68 61 6e 67 65 20    @ Name change 
3410: 66 72 6f 6d 20 25 68 28 7a 4f 6c 64 4e 61 6d 65  from %h(zOldName
3420: 29 20 74 6f 20 25 68 28 7a 4e 61 6d 65 29 2e 0a  ) to %h(zName)..
3430: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6f      }else if( fo
3440: 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a 4e 65 77  ssil_strcmp(zNew
3450: 2c 20 7a 4f 6c 64 29 3d 3d 30 20 29 7b 0a 20 20  , zOld)==0 ){.  
3460: 20 20 20 20 69 66 28 20 6d 70 65 72 6d 3d 3d 50      if( mperm==P
3470: 45 52 4d 5f 45 58 45 20 29 7b 0a 20 20 20 20 20  ERM_EXE ){.     
3480: 20 20 20 40 20 25 68 28 7a 4e 61 6d 65 29 20 62     @ %h(zName) b
3490: 65 63 61 6d 65 20 65 78 65 63 75 74 61 62 6c 65  ecame executable
34a0: 2e 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ..      }else if
34b0: 28 20 6d 70 65 72 6d 3d 3d 50 45 52 4d 5f 4c 4e  ( mperm==PERM_LN
34c0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 40 20 25  K ){.        @ %
34d0: 68 28 7a 4e 61 6d 65 29 20 62 65 63 61 6d 65 20  h(zName) became 
34e0: 61 20 73 79 6d 6c 69 6e 6b 2e 0a 20 20 20 20 20  a symlink..     
34f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3500: 40 20 25 68 28 7a 4e 61 6d 65 29 20 62 65 63 61  @ %h(zName) beca
3510: 6d 65 20 61 20 72 65 67 75 6c 61 72 20 66 69 6c  me a regular fil
3520: 65 2e 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e..      }.    }
3530: 65 6c 73 65 7b 0a 20 20 20 20 20 20 40 20 43 68  else{.      @ Ch
3540: 61 6e 67 65 73 20 74 6f 20 25 68 28 7a 4e 61 6d  anges to %h(zNam
3550: 65 29 2e 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e)..    }.    if
3560: 28 20 64 69 66 66 46 6c 61 67 73 20 29 7b 0a 20  ( diffFlags ){. 
3570: 20 20 20 20 20 61 70 70 65 6e 64 5f 64 69 66 66       append_diff
3580: 28 7a 4f 6c 64 2c 20 7a 4e 65 77 2c 20 64 69 66  (zOld, zNew, dif
3590: 66 46 6c 61 67 73 2c 20 70 52 65 29 3b 0a 20 20  fFlags, pRe);.  
35a0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
35b0: 20 69 66 28 20 7a 4f 6c 64 20 26 26 20 7a 4e 65   if( zOld && zNe
35c0: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66  w ){.      if( f
35d0: 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a 4f 6c  ossil_strcmp(zOl
35e0: 64 2c 20 7a 4e 65 77 29 21 3d 30 20 29 7b 0a 20  d, zNew)!=0 ){. 
35f0: 20 20 20 20 20 20 20 40 20 4d 6f 64 69 66 69 65         @ Modifie
3600: 64 20 25 7a 28 68 72 65 66 28 22 25 52 2f 66 69  d %z(href("%R/fi
3610: 6e 66 6f 3f 6e 61 6d 65 3d 25 54 26 6d 3d 25 21  nfo?name=%T&m=%!
3620: 53 22 2c 7a 4e 61 6d 65 2c 7a 4e 65 77 29 29 25  S",zName,zNew))%
3630: 68 28 7a 4e 61 6d 65 29 3c 2f 61 3e 0a 20 20 20  h(zName)</a>.   
3640: 20 20 20 20 20 40 20 66 72 6f 6d 20 25 7a 28 68       @ from %z(h
3650: 72 65 66 28 22 25 52 2f 61 72 74 69 66 61 63 74  ref("%R/artifact
3660: 2f 25 21 53 22 2c 7a 4f 6c 64 29 29 5b 25 53 28  /%!S",zOld))[%S(
3670: 7a 4f 6c 64 29 5d 3c 2f 61 3e 0a 20 20 20 20 20  zOld)]</a>.     
3680: 20 20 20 40 20 74 6f 20 25 7a 28 68 72 65 66 28     @ to %z(href(
3690: 22 25 52 2f 61 72 74 69 66 61 63 74 2f 25 21 53  "%R/artifact/%!S
36a0: 22 2c 7a 4e 65 77 29 29 5b 25 53 28 7a 4e 65 77  ",zNew))[%S(zNew
36b0: 29 5d 3c 2f 61 3e 2e 0a 20 20 20 20 20 20 7d 65  )]</a>..      }e
36c0: 6c 73 65 20 69 66 28 20 7a 4f 6c 64 4e 61 6d 65  lse if( zOldName
36d0: 21 3d 30 20 26 26 20 66 6f 73 73 69 6c 5f 73 74  !=0 && fossil_st
36e0: 72 63 6d 70 28 7a 4e 61 6d 65 2c 7a 4f 6c 64 4e  rcmp(zName,zOldN
36f0: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
3700: 20 20 20 40 20 4e 61 6d 65 20 63 68 61 6e 67 65     @ Name change
3710: 0a 20 20 20 20 20 20 20 20 40 20 66 72 6f 6d 20  .        @ from 
3720: 25 7a 28 68 72 65 66 28 22 25 52 2f 66 69 6e 66  %z(href("%R/finf
3730: 6f 3f 6e 61 6d 65 3d 25 54 26 6d 3d 25 21 53 22  o?name=%T&m=%!S"
3740: 2c 7a 4f 6c 64 4e 61 6d 65 2c 7a 4f 6c 64 29 29  ,zOldName,zOld))
3750: 25 68 28 7a 4f 6c 64 4e 61 6d 65 29 3c 2f 61 3e  %h(zOldName)</a>
3760: 0a 20 20 20 20 20 20 20 20 40 20 74 6f 20 25 7a  .        @ to %z
3770: 28 68 72 65 66 28 22 25 52 2f 66 69 6e 66 6f 3f  (href("%R/finfo?
3780: 6e 61 6d 65 3d 25 54 26 6d 3d 25 21 53 22 2c 7a  name=%T&m=%!S",z
3790: 4e 61 6d 65 2c 7a 4e 65 77 29 29 25 68 28 7a 4e  Name,zNew))%h(zN
37a0: 61 6d 65 29 3c 2f 61 3e 2e 0a 20 20 20 20 20 20  ame)</a>..      
37b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 40  }else{.        @
37c0: 20 25 7a 28 68 72 65 66 28 22 25 52 2f 66 69 6e   %z(href("%R/fin
37d0: 66 6f 3f 6e 61 6d 65 3d 25 54 26 6d 3d 25 21 53  fo?name=%T&m=%!S
37e0: 22 2c 7a 4e 61 6d 65 2c 7a 4e 65 77 29 29 25 68  ",zName,zNew))%h
37f0: 28 7a 4e 61 6d 65 29 3c 2f 61 3e 20 62 65 63 61  (zName)</a> beca
3800: 6d 65 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  me.        if( m
3810: 70 65 72 6d 3d 3d 50 45 52 4d 5f 45 58 45 20 29  perm==PERM_EXE )
3820: 7b 0a 20 20 20 20 20 20 20 20 20 20 40 20 65 78  {.          @ ex
3830: 65 63 75 74 61 62 6c 65 20 77 69 74 68 20 63 6f  ecutable with co
3840: 6e 74 65 6e 74 73 0a 20 20 20 20 20 20 20 20 7d  ntents.        }
3850: 65 6c 73 65 20 69 66 28 20 6d 70 65 72 6d 3d 3d  else if( mperm==
3860: 50 45 52 4d 5f 4c 4e 4b 20 29 7b 0a 20 20 20 20  PERM_LNK ){.    
3870: 20 20 20 20 20 20 40 20 61 20 73 79 6d 6c 69 6e        @ a symlin
3880: 6b 20 77 69 74 68 20 74 61 72 67 65 74 0a 20 20  k with target.  
3890: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
38a0: 20 20 20 20 20 20 20 40 20 61 20 72 65 67 75 6c         @ a regul
38b0: 61 72 20 66 69 6c 65 20 77 69 74 68 20 63 6f 6e  ar file with con
38c0: 74 65 6e 74 73 0a 20 20 20 20 20 20 20 20 7d 0a  tents.        }.
38d0: 20 20 20 20 20 20 20 20 40 20 25 7a 28 68 72 65          @ %z(hre
38e0: 66 28 22 25 52 2f 61 72 74 69 66 61 63 74 2f 25  f("%R/artifact/%
38f0: 21 53 22 2c 7a 4e 65 77 29 29 5b 25 53 28 7a 4e  !S",zNew))[%S(zN
3900: 65 77 29 5d 3c 2f 61 3e 2e 0a 20 20 20 20 20 20  ew)]</a>..      
3910: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
3920: 7a 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 40 20  zOld ){.      @ 
3930: 44 65 6c 65 74 65 64 20 25 7a 28 68 72 65 66 28  Deleted %z(href(
3940: 22 25 52 2f 66 69 6e 66 6f 3f 6e 61 6d 65 3d 25  "%R/finfo?name=%
3950: 54 26 6d 3d 25 21 53 22 2c 7a 4e 61 6d 65 2c 7a  T&m=%!S",zName,z
3960: 4f 6c 64 29 29 25 68 28 7a 4e 61 6d 65 29 3c 2f  Old))%h(zName)</
3970: 61 3e 0a 20 20 20 20 20 20 40 20 76 65 72 73 69  a>.      @ versi
3980: 6f 6e 20 25 7a 28 68 72 65 66 28 22 25 52 2f 61  on %z(href("%R/a
3990: 72 74 69 66 61 63 74 2f 25 21 53 22 2c 7a 4f 6c  rtifact/%!S",zOl
39a0: 64 29 29 5b 25 53 28 7a 4f 6c 64 29 5d 3c 2f 61  d))[%S(zOld)]</a
39b0: 3e 2e 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  >..    }else{.  
39c0: 20 20 20 20 40 20 41 64 64 65 64 20 25 7a 28 68      @ Added %z(h
39d0: 72 65 66 28 22 25 52 2f 66 69 6e 66 6f 3f 6e 61  ref("%R/finfo?na
39e0: 6d 65 3d 25 54 26 6d 3d 25 21 53 22 2c 7a 4e 61  me=%T&m=%!S",zNa
39f0: 6d 65 2c 7a 4e 65 77 29 29 25 68 28 7a 4e 61 6d  me,zNew))%h(zNam
3a00: 65 29 3c 2f 61 3e 0a 20 20 20 20 20 20 40 20 76  e)</a>.      @ v
3a10: 65 72 73 69 6f 6e 20 25 7a 28 68 72 65 66 28 22  ersion %z(href("
3a20: 25 52 2f 61 72 74 69 66 61 63 74 2f 25 21 53 22  %R/artifact/%!S"
3a30: 2c 7a 4e 65 77 29 29 5b 25 53 28 7a 4e 65 77 29  ,zNew))[%S(zNew)
3a40: 5d 3c 2f 61 3e 2e 0a 20 20 20 20 7d 0a 20 20 20  ]</a>..    }.   
3a50: 20 69 66 28 20 64 69 66 66 46 6c 61 67 73 20 29   if( diffFlags )
3a60: 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 5f 64  {.      append_d
3a70: 69 66 66 28 7a 4f 6c 64 2c 20 7a 4e 65 77 2c 20  iff(zOld, zNew, 
3a80: 64 69 66 66 46 6c 61 67 73 2c 20 70 52 65 29 3b  diffFlags, pRe);
3a90: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
3aa0: 4f 6c 64 20 26 26 20 7a 4e 65 77 20 26 26 20 66  Old && zNew && f
3ab0: 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a 4f 6c  ossil_strcmp(zOl
3ac0: 64 2c 7a 4e 65 77 29 21 3d 30 20 29 7b 0a 20 20  d,zNew)!=0 ){.  
3ad0: 20 20 20 20 40 20 26 6e 62 73 70 3b 26 6e 62 73      @ &nbsp;&nbs
3ae0: 70 3b 0a 20 20 20 20 20 20 40 20 25 7a 28 68 72  p;.      @ %z(hr
3af0: 65 66 28 22 25 52 2f 66 64 69 66 66 3f 76 31 3d  ef("%R/fdiff?v1=
3b00: 25 21 53 26 76 32 3d 25 21 53 22 2c 7a 4f 6c 64  %!S&v2=%!S",zOld
3b10: 2c 7a 4e 65 77 29 29 5b 64 69 66 66 5d 3c 2f 61  ,zNew))[diff]</a
3b20: 3e 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 40 20  >.    }.  }.  @ 
3b30: 3c 2f 70 3e 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  </p>.}../*.** Ge
3b40: 6e 65 72 61 74 65 20 6a 61 76 61 73 63 72 69 70  nerate javascrip
3b50: 74 20 74 6f 20 65 6e 68 61 6e 63 65 20 48 54 4d  t to enhance HTM
3b60: 4c 20 64 69 66 66 73 2e 0a 2a 2f 0a 76 6f 69 64  L diffs..*/.void
3b70: 20 61 70 70 65 6e 64 5f 64 69 66 66 5f 6a 61 76   append_diff_jav
3b80: 61 73 63 72 69 70 74 28 69 6e 74 20 73 69 64 65  ascript(int side
3b90: 42 79 53 69 64 65 29 7b 0a 20 20 69 66 28 20 21  BySide){.  if( !
3ba0: 73 69 64 65 42 79 53 69 64 65 20 29 20 72 65 74  sideBySide ) ret
3bb0: 75 72 6e 3b 0a 20 20 73 74 79 6c 65 5f 6c 6f 61  urn;.  style_loa
3bc0: 64 5f 6f 6e 65 5f 6a 73 5f 66 69 6c 65 28 22 73  d_one_js_file("s
3bd0: 62 73 64 69 66 66 2e 6a 73 22 29 3b 0a 7d 0a 0a  bsdiff.js");.}..
3be0: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
3bf0: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 64  an appropriate d
3c00: 69 66 66 46 6c 61 67 20 66 6f 72 20 74 65 78 74  iffFlag for text
3c10: 5f 64 69 66 66 28 29 20 62 61 73 65 64 20 6f 6e  _diff() based on
3c20: 20 71 75 65 72 79 0a 2a 2a 20 70 61 72 61 6d 65   query.** parame
3c30: 74 65 72 73 20 61 6e 64 20 74 68 65 20 74 6f 20  ters and the to 
3c40: 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74  boolean argument
3c50: 73 2e 0a 2a 2f 0a 75 36 34 20 63 6f 6e 73 74 72  s..*/.u64 constr
3c60: 75 63 74 5f 64 69 66 66 5f 66 6c 61 67 73 28 69  uct_diff_flags(i
3c70: 6e 74 20 64 69 66 66 54 79 70 65 29 7b 0a 20 20  nt diffType){.  
3c80: 75 36 34 20 64 69 66 66 46 6c 61 67 73 20 3d 20  u64 diffFlags = 
3c90: 30 3b 20 20 2f 2a 20 5a 65 72 6f 20 6d 65 61 6e  0;  /* Zero mean
3ca0: 73 20 64 6f 20 6e 6f 74 20 73 68 6f 77 20 61 6e  s do not show an
3cb0: 79 20 64 69 66 66 20 2a 2f 0a 20 20 69 66 28 20  y diff */.  if( 
3cc0: 64 69 66 66 54 79 70 65 3e 30 20 29 7b 0a 20 20  diffType>0 ){.  
3cd0: 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 69 66 28    int x;.    if(
3ce0: 20 64 69 66 66 54 79 70 65 3d 3d 32 20 29 7b 0a   diffType==2 ){.
3cf0: 20 20 20 20 20 20 64 69 66 66 46 6c 61 67 73 20        diffFlags 
3d00: 3d 20 44 49 46 46 5f 53 49 44 45 42 59 53 49 44  = DIFF_SIDEBYSID
3d10: 45 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 22 64 77  E;..      /* "dw
3d20: 22 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  " query paramete
3d30: 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77 69 64  r determines wid
3d40: 74 68 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d  th of each colum
3d50: 6e 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 61  n */.      x = a
3d60: 74 6f 69 28 50 44 28 22 64 77 22 2c 22 38 30 22  toi(PD("dw","80"
3d70: 29 29 2a 28 44 49 46 46 5f 43 4f 4e 54 45 58 54  ))*(DIFF_CONTEXT
3d80: 5f 4d 41 53 4b 2b 31 29 3b 0a 20 20 20 20 20 20  _MASK+1);.      
3d90: 69 66 28 20 78 3c 30 20 7c 7c 20 78 3e 44 49 46  if( x<0 || x>DIF
3da0: 46 5f 57 49 44 54 48 5f 4d 41 53 4b 20 29 20 78  F_WIDTH_MASK ) x
3db0: 20 3d 20 44 49 46 46 5f 57 49 44 54 48 5f 4d 41   = DIFF_WIDTH_MA
3dc0: 53 4b 3b 0a 20 20 20 20 20 20 64 69 66 66 46 6c  SK;.      diffFl
3dd0: 61 67 73 20 2b 3d 20 78 3b 0a 20 20 20 20 7d 0a  ags += x;.    }.
3de0: 0a 20 20 20 20 69 66 28 20 50 28 22 77 22 29 20  .    if( P("w") 
3df0: 29 7b 0a 20 20 20 20 20 20 64 69 66 66 46 6c 61  ){.      diffFla
3e00: 67 73 20 7c 3d 20 44 49 46 46 5f 49 47 4e 4f 52  gs |= DIFF_IGNOR
3e10: 45 5f 41 4c 4c 57 53 3b 0a 20 20 20 20 7d 0a 20  E_ALLWS;.    }. 
3e20: 20 20 20 2f 2a 20 22 64 63 22 20 71 75 65 72 79     /* "dc" query
3e30: 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72   parameter deter
3e40: 6d 69 6e 65 73 20 6c 69 6e 65 73 20 6f 66 20 63  mines lines of c
3e50: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 78 20  ontext */.    x 
3e60: 3d 20 61 74 6f 69 28 50 44 28 22 64 63 22 2c 22  = atoi(PD("dc","
3e70: 37 22 29 29 3b 0a 20 20 20 20 69 66 28 20 78 3c  7"));.    if( x<
3e80: 30 20 7c 7c 20 78 3e 44 49 46 46 5f 43 4f 4e 54  0 || x>DIFF_CONT
3e90: 45 58 54 5f 4d 41 53 4b 20 29 20 78 20 3d 20 44  EXT_MASK ) x = D
3ea0: 49 46 46 5f 43 4f 4e 54 45 58 54 5f 4d 41 53 4b  IFF_CONTEXT_MASK
3eb0: 3b 0a 20 20 20 20 64 69 66 66 46 6c 61 67 73 20  ;.    diffFlags 
3ec0: 2b 3d 20 78 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  += x;..    /* Th
3ed0: 65 20 22 6e 6f 6f 70 74 22 20 70 61 72 61 6d 65  e "noopt" parame
3ee0: 74 65 72 20 64 69 73 61 62 6c 65 73 20 64 69 66  ter disables dif
3ef0: 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a  f optimization *
3f00: 2f 0a 20 20 20 20 69 66 28 20 50 44 28 22 6e 6f  /.    if( PD("no
3f10: 6f 70 74 22 2c 30 29 21 3d 30 20 29 20 64 69 66  opt",0)!=0 ) dif
3f20: 66 46 6c 61 67 73 20 7c 3d 20 44 49 46 46 5f 4e  fFlags |= DIFF_N
3f30: 4f 4f 50 54 3b 0a 20 20 20 20 64 69 66 66 46 6c  OOPT;.    diffFl
3f40: 61 67 73 20 7c 3d 20 44 49 46 46 5f 53 54 52 49  ags |= DIFF_STRI
3f50: 50 5f 45 4f 4c 43 52 3b 0a 20 20 7d 0a 20 20 72  P_EOLCR;.  }.  r
3f60: 65 74 75 72 6e 20 64 69 66 66 46 6c 61 67 73 3b  eturn diffFlags;
3f70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47  .}../*.** WEBPAG
3f80: 45 3a 20 63 69 5f 74 61 67 73 0a 2a 2a 20 55 52  E: ci_tags.** UR
3f90: 4c 3a 20 20 20 20 2f 63 69 5f 74 61 67 73 3f 6e  L:    /ci_tags?n
3fa0: 61 6d 65 3d 41 52 54 49 46 41 43 54 49 44 0a 2a  ame=ARTIFACTID.*
3fb0: 2a 0a 2a 2a 20 53 68 6f 77 20 61 6c 6c 20 74 61  *.** Show all ta
3fc0: 67 73 20 61 6e 64 20 70 72 6f 70 65 72 74 69 65  gs and propertie
3fd0: 73 20 66 6f 72 20 61 20 67 69 76 65 6e 20 63 68  s for a given ch
3fe0: 65 63 6b 2d 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  eck-in..**.** Th
3ff0: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  is information u
4000: 73 65 64 20 74 6f 20 62 65 20 70 61 72 74 20 6f  sed to be part o
4010: 66 20 74 68 65 20 6d 61 69 6e 20 2f 63 69 20 70  f the main /ci p
4020: 61 67 65 2c 20 62 75 74 20 69 74 20 69 73 20 6f  age, but it is o
4030: 66 0a 2a 2a 20 6d 61 72 67 69 6e 61 6c 20 75 73  f.** marginal us
4040: 65 66 75 6c 6e 65 73 73 2e 20 20 42 65 74 74 65  efulness.  Bette
4050: 72 20 74 6f 20 66 61 63 74 6f 72 20 69 74 20 6f  r to factor it o
4060: 75 74 20 69 6e 74 6f 20 61 20 73 75 62 2d 73 63  ut into a sub-sc
4070: 72 65 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 63 69  reen..*/.void ci
4080: 5f 74 61 67 73 5f 70 61 67 65 28 76 6f 69 64 29  _tags_page(void)
4090: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
40a0: 7a 48 61 73 68 3b 0a 20 20 69 6e 74 20 72 69 64  zHash;.  int rid
40b0: 3b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 69 6e  ;.  Stmt q;.  in
40c0: 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 42 6c 6f  t cnt = 0;.  Blo
40d0: 62 20 73 71 6c 3b 0a 0a 20 20 6c 6f 67 69 6e 5f  b sql;..  login_
40e0: 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c  check_credential
40f0: 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 70 65  s();.  if( !g.pe
4100: 72 6d 2e 52 65 61 64 20 29 7b 20 6c 6f 67 69 6e  rm.Read ){ login
4110: 5f 6e 65 65 64 65 64 28 67 2e 61 6e 6f 6e 2e 52  _needed(g.anon.R
4120: 65 61 64 29 3b 20 72 65 74 75 72 6e 3b 20 7d 0a  ead); return; }.
4130: 20 20 72 69 64 20 3d 20 6e 61 6d 65 5f 74 6f 5f    rid = name_to_
4140: 72 69 64 5f 77 77 77 28 22 6e 61 6d 65 22 29 3b  rid_www("name");
4150: 0a 20 20 69 66 28 20 72 69 64 3d 3d 30 20 29 7b  .  if( rid==0 ){
4160: 0a 20 20 20 20 73 74 79 6c 65 5f 68 65 61 64 65  .    style_heade
4170: 72 28 22 43 68 65 63 6b 2d 69 6e 20 49 6e 66 6f  r("Check-in Info
4180: 72 6d 61 74 69 6f 6e 20 45 72 72 6f 72 22 29 3b  rmation Error");
4190: 0a 20 20 20 20 40 20 4e 6f 20 73 75 63 68 20 6f  .    @ No such o
41a0: 62 6a 65 63 74 3a 20 25 68 28 67 2e 61 72 67 76  bject: %h(g.argv
41b0: 5b 32 5d 29 0a 20 20 20 20 73 74 79 6c 65 5f 66  [2]).    style_f
41c0: 6f 6f 74 65 72 28 29 3b 0a 20 20 20 20 72 65 74  ooter();.    ret
41d0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 48 61 73 68  urn;.  }.  zHash
41e0: 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53   = db_text(0, "S
41f0: 45 4c 45 43 54 20 75 75 69 64 20 46 52 4f 4d 20  ELECT uuid FROM 
4200: 62 6c 6f 62 20 57 48 45 52 45 20 72 69 64 3d 25  blob WHERE rid=%
4210: 64 22 2c 20 72 69 64 29 3b 0a 20 20 73 74 79 6c  d", rid);.  styl
4220: 65 5f 68 65 61 64 65 72 28 22 54 61 67 73 20 61  e_header("Tags a
4230: 6e 64 20 50 72 6f 70 65 72 74 69 65 73 22 29 3b  nd Properties");
4240: 0a 20 20 40 20 3c 68 31 3e 54 61 67 73 20 61 6e  .  @ <h1>Tags an
4250: 64 20 50 72 6f 70 65 72 74 69 65 73 20 66 6f 72  d Properties for
4260: 20 43 68 65 63 6b 2d 49 6e 20 5c 0a 20 20 40 20   Check-In \.  @ 
4270: 25 7a 28 68 72 65 66 28 22 25 52 2f 63 69 2f 25  %z(href("%R/ci/%
4280: 21 53 22 2c 7a 48 61 73 68 29 29 25 53 28 7a 48  !S",zHash))%S(zH
4290: 61 73 68 29 3c 2f 61 3e 3c 2f 68 31 3e 0a 20 20  ash)</a></h1>.  
42a0: 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 0a 20  db_prepare(&q,. 
42b0: 20 20 20 22 53 45 4c 45 43 54 20 74 61 67 2e 74     "SELECT tag.t
42c0: 61 67 69 64 2c 20 74 61 67 6e 61 6d 65 2c 20 22  agid, tagname, "
42d0: 0a 20 20 20 20 22 20 20 20 20 20 20 20 28 53 45  .    "       (SE
42e0: 4c 45 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62  LECT uuid FROM b
42f0: 6c 6f 62 20 57 48 45 52 45 20 72 69 64 3d 74 61  lob WHERE rid=ta
4300: 67 78 72 65 66 2e 73 72 63 69 64 20 41 4e 44 20  gxref.srcid AND 
4310: 72 69 64 21 3d 25 64 29 2c 22 0a 20 20 20 20 22  rid!=%d),".    "
4320: 20 20 20 20 20 20 20 76 61 6c 75 65 2c 20 64 61         value, da
4330: 74 65 74 69 6d 65 28 74 61 67 78 72 65 66 2e 6d  tetime(tagxref.m
4340: 74 69 6d 65 2c 74 6f 4c 6f 63 61 6c 28 29 29 2c  time,toLocal()),
4350: 20 74 61 67 74 79 70 65 2c 22 0a 20 20 20 20 22   tagtype,".    "
4360: 20 20 20 20 20 20 20 28 53 45 4c 45 43 54 20 75         (SELECT u
4370: 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48  uid FROM blob WH
4380: 45 52 45 20 72 69 64 3d 74 61 67 78 72 65 66 2e  ERE rid=tagxref.
4390: 6f 72 69 67 69 64 20 41 4e 44 20 72 69 64 21 3d  origid AND rid!=
43a0: 25 64 29 22 0a 20 20 20 20 22 20 20 46 52 4f 4d  %d)".    "  FROM
43b0: 20 74 61 67 78 72 65 66 20 4a 4f 49 4e 20 74 61   tagxref JOIN ta
43c0: 67 20 4f 4e 20 74 61 67 78 72 65 66 2e 74 61 67  g ON tagxref.tag
43d0: 69 64 3d 74 61 67 2e 74 61 67 69 64 22 0a 20 20  id=tag.tagid".  
43e0: 20 20 22 20 57 48 45 52 45 20 74 61 67 78 72 65    " WHERE tagxre
43f0: 66 2e 72 69 64 3d 25 64 22 0a 20 20 20 20 22 20  f.rid=%d".    " 
4400: 4f 52 44 45 52 20 42 59 20 74 61 67 6e 61 6d 65  ORDER BY tagname
4410: 20 2f 2a 73 6f 72 74 2a 2f 22 2c 20 72 69 64 2c   /*sort*/", rid,
4420: 20 72 69 64 2c 20 72 69 64 0a 20 20 29 3b 0a 20   rid, rid.  );. 
4430: 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28   while( db_step(
4440: 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  &q)==SQLITE_ROW 
4450: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
4460: 72 20 2a 7a 54 61 67 6e 61 6d 65 20 3d 20 64 62  r *zTagname = db
4470: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c  _column_text(&q,
4480: 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63   1);.    const c
4490: 68 61 72 20 2a 7a 53 72 63 55 75 69 64 20 3d 20  har *zSrcUuid = 
44a0: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
44b0: 71 2c 20 32 29 3b 0a 20 20 20 20 63 6f 6e 73 74  q, 2);.    const
44c0: 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 20 3d 20   char *zValue = 
44d0: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
44e0: 71 2c 20 33 29 3b 0a 20 20 20 20 63 6f 6e 73 74  q, 3);.    const
44f0: 20 63 68 61 72 20 2a 7a 44 61 74 65 20 3d 20 64   char *zDate = d
4500: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
4510: 2c 20 34 29 3b 0a 20 20 20 20 69 6e 74 20 74 61  , 4);.    int ta
4520: 67 74 79 70 65 20 3d 20 64 62 5f 63 6f 6c 75 6d  gtype = db_colum
4530: 6e 5f 69 6e 74 28 26 71 2c 20 35 29 3b 0a 20 20  n_int(&q, 5);.  
4540: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
4550: 72 69 67 55 75 69 64 20 3d 20 64 62 5f 63 6f 6c  rigUuid = db_col
4560: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 36 29 3b  umn_text(&q, 6);
4570: 0a 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20  .    cnt++;.    
4580: 69 66 28 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20  if( cnt==1 ){.  
4590: 20 20 20 20 40 20 3c 75 6c 3e 0a 20 20 20 20 7d      @ <ul>.    }
45a0: 0a 20 20 20 20 40 20 3c 6c 69 3e 0a 20 20 20 20  .    @ <li>.    
45b0: 69 66 28 20 74 61 67 74 79 70 65 3d 3d 30 20 29  if( tagtype==0 )
45c0: 7b 0a 20 20 20 20 20 20 40 20 3c 73 70 61 6e 20  {.      @ <span 
45d0: 63 6c 61 73 73 3d 22 69 6e 66 6f 54 61 67 43 61  class="infoTagCa
45e0: 6e 63 65 6c 6c 65 64 22 3e 25 68 28 7a 54 61 67  ncelled">%h(zTag
45f0: 6e 61 6d 65 29 3c 2f 73 70 61 6e 3e 20 63 61 6e  name)</span> can
4600: 63 65 6c 6c 65 64 0a 20 20 20 20 7d 65 6c 73 65  celled.    }else
4610: 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20   if( zValue ){. 
4620: 20 20 20 20 20 40 20 3c 73 70 61 6e 20 63 6c 61       @ <span cla
4630: 73 73 3d 22 69 6e 66 6f 54 61 67 22 3e 25 68 28  ss="infoTag">%h(
4640: 7a 54 61 67 6e 61 6d 65 29 3d 25 68 28 7a 56 61  zTagname)=%h(zVa
4650: 6c 75 65 29 3c 2f 73 70 61 6e 3e 0a 20 20 20 20  lue)</span>.    
4660: 7d 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 40 20  }else {.      @ 
4670: 3c 73 70 61 6e 20 63 6c 61 73 73 3d 22 69 6e 66  <span class="inf
4680: 6f 54 61 67 22 3e 25 68 28 7a 54 61 67 6e 61 6d  oTag">%h(zTagnam
4690: 65 29 3c 2f 73 70 61 6e 3e 0a 20 20 20 20 7d 0a  e)</span>.    }.
46a0: 20 20 20 20 69 66 28 20 74 61 67 74 79 70 65 3d      if( tagtype=
46b0: 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
46c0: 7a 4f 72 69 67 55 75 69 64 20 26 26 20 7a 4f 72  zOrigUuid && zOr
46d0: 69 67 55 75 69 64 5b 30 5d 20 29 7b 0a 20 20 20  igUuid[0] ){.   
46e0: 20 20 20 20 20 40 20 69 6e 68 65 72 69 74 65 64       @ inherited
46f0: 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 68 79   from.        hy
4700: 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 75 69 64 28  perlink_to_uuid(
4710: 7a 4f 72 69 67 55 75 69 64 29 3b 0a 20 20 20 20  zOrigUuid);.    
4720: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4730: 20 40 20 70 72 6f 70 61 67 61 74 65 73 20 74 6f   @ propagates to
4740: 20 64 65 73 63 65 6e 64 61 6e 74 73 0a 20 20 20   descendants.   
4750: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
4760: 66 28 20 7a 53 72 63 55 75 69 64 20 26 26 20 7a  f( zSrcUuid && z
4770: 53 72 63 55 75 69 64 5b 30 5d 20 29 7b 0a 20 20  SrcUuid[0] ){.  
4780: 20 20 20 20 69 66 28 20 74 61 67 74 79 70 65 3d      if( tagtype=
4790: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 40 20  =0 ){.        @ 
47a0: 62 79 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  by.      }else{.
47b0: 20 20 20 20 20 20 20 20 40 20 61 64 64 65 64 20          @ added 
47c0: 62 79 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  by.      }.     
47d0: 20 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 75   hyperlink_to_uu
47e0: 69 64 28 7a 53 72 63 55 75 69 64 29 3b 0a 20 20  id(zSrcUuid);.  
47f0: 20 20 20 20 40 20 6f 6e 0a 20 20 20 20 20 20 68      @ on.      h
4800: 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 64 61 74 65  yperlink_to_date
4810: 28 7a 44 61 74 65 2c 30 29 3b 0a 20 20 20 20 7d  (zDate,0);.    }
4820: 0a 20 20 20 20 40 20 3c 2f 6c 69 3e 0a 20 20 7d  .    @ </li>.  }
4830: 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26  .  db_finalize(&
4840: 71 29 3b 0a 20 20 69 66 28 20 63 6e 74 20 29 7b  q);.  if( cnt ){
4850: 0a 20 20 20 20 40 20 3c 2f 75 6c 3e 0a 20 20 7d  .    @ </ul>.  }
4860: 0a 20 20 40 20 3c 64 69 76 20 63 6c 61 73 73 3d  .  @ <div class=
4870: 22 73 65 63 74 69 6f 6e 22 3e 43 6f 6e 74 65 78  "section">Contex
4880: 74 3c 2f 64 69 76 3e 0a 20 20 64 62 5f 6d 75 6c  t</div>.  db_mul
4890: 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20 22 43  ti_exec(.     "C
48a0: 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45  REATE TEMP TABLE
48b0: 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 6f   IF NOT EXISTS o
48c0: 6b 28 72 69 64 20 49 4e 54 45 47 45 52 20 50 52  k(rid INTEGER PR
48d0: 49 4d 41 52 59 20 4b 45 59 29 3b 22 0a 20 20 20  IMARY KEY);".   
48e0: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 6f    "DELETE FROM o
48f0: 6b 3b 22 0a 20 20 20 20 20 22 49 4e 53 45 52 54  k;".     "INSERT
4900: 20 49 4e 54 4f 20 6f 6b 20 56 41 4c 55 45 53 28   INTO ok VALUES(
4910: 25 64 29 3b 22 0a 20 20 20 20 20 22 49 4e 53 45  %d);".     "INSE
4920: 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
4930: 4f 20 6f 6b 20 22 0a 20 20 20 20 20 22 20 53 45  O ok ".     " SE
4940: 4c 45 43 54 20 74 61 67 78 72 65 66 2e 73 72 63  LECT tagxref.src
4950: 69 64 22 0a 20 20 20 20 20 22 20 20 20 46 52 4f  id".     "   FRO
4960: 4d 20 74 61 67 78 72 65 66 20 4a 4f 49 4e 20 74  M tagxref JOIN t
4970: 61 67 20 4f 4e 20 74 61 67 78 72 65 66 2e 74 61  ag ON tagxref.ta
4980: 67 69 64 3d 74 61 67 2e 74 61 67 69 64 22 0a 20  gid=tag.tagid". 
4990: 20 20 20 20 22 20 20 57 48 45 52 45 20 74 61 67      "  WHERE tag
49a0: 78 72 65 66 2e 72 69 64 3d 25 64 3b 22 0a 20 20  xref.rid=%d;".  
49b0: 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47     "INSERT OR IG
49c0: 4e 4f 52 45 20 49 4e 54 4f 20 6f 6b 20 22 0a 20  NORE INTO ok ". 
49d0: 20 20 20 20 22 20 53 45 4c 45 43 54 20 74 61 67      " SELECT tag
49e0: 78 72 65 66 2e 6f 72 69 67 69 64 22 0a 20 20 20  xref.origid".   
49f0: 20 20 22 20 20 20 46 52 4f 4d 20 74 61 67 78 72    "   FROM tagxr
4a00: 65 66 20 4a 4f 49 4e 20 74 61 67 20 4f 4e 20 74  ef JOIN tag ON t
4a10: 61 67 78 72 65 66 2e 74 61 67 69 64 3d 74 61 67  agxref.tagid=tag
4a20: 2e 74 61 67 69 64 22 0a 20 20 20 20 20 22 20 20  .tagid".     "  
4a30: 57 48 45 52 45 20 74 61 67 78 72 65 66 2e 72 69  WHERE tagxref.ri
4a40: 64 3d 25 64 3b 22 2c 0a 20 20 20 20 20 72 69 64  d=%d;",.     rid
4a50: 2c 20 72 69 64 2c 20 72 69 64 0a 20 20 29 3b 0a  , rid, rid.  );.
4a60: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
4a70: 0a 20 20 20 20 22 53 45 4c 45 43 54 20 74 61 67  .    "SELECT tag
4a80: 2e 74 61 67 69 64 2c 20 74 61 67 6e 61 6d 65 2c  .tagid, tagname,
4a90: 20 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 28   ".    "       (
4aa0: 53 45 4c 45 43 54 20 75 75 69 64 20 46 52 4f 4d  SELECT uuid FROM
4ab0: 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69 64 3d   blob WHERE rid=
4ac0: 74 61 67 78 72 65 66 2e 73 72 63 69 64 20 41 4e  tagxref.srcid AN
4ad0: 44 20 72 69 64 21 3d 25 64 29 2c 22 0a 20 20 20  D rid!=%d),".   
4ae0: 20 22 20 20 20 20 20 20 20 76 61 6c 75 65 2c 20   "       value, 
4af0: 64 61 74 65 74 69 6d 65 28 74 61 67 78 72 65 66  datetime(tagxref
4b00: 2e 6d 74 69 6d 65 2c 74 6f 4c 6f 63 61 6c 28 29  .mtime,toLocal()
4b10: 29 2c 20 74 61 67 74 79 70 65 2c 22 0a 20 20 20  ), tagtype,".   
4b20: 20 22 20 20 20 20 20 20 20 28 53 45 4c 45 43 54   "       (SELECT
4b30: 20 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62 20   uuid FROM blob 
4b40: 57 48 45 52 45 20 72 69 64 3d 74 61 67 78 72 65  WHERE rid=tagxre
4b50: 66 2e 6f 72 69 67 69 64 20 41 4e 44 20 72 69 64  f.origid AND rid
4b60: 21 3d 25 64 29 22 0a 20 20 20 20 22 20 20 46 52  !=%d)".    "  FR
4b70: 4f 4d 20 74 61 67 78 72 65 66 20 4a 4f 49 4e 20  OM tagxref JOIN 
4b80: 74 61 67 20 4f 4e 20 74 61 67 78 72 65 66 2e 74  tag ON tagxref.t
4b90: 61 67 69 64 3d 74 61 67 2e 74 61 67 69 64 22 0a  agid=tag.tagid".
4ba0: 20 20 20 20 22 20 57 48 45 52 45 20 74 61 67 78      " WHERE tagx
4bb0: 72 65 66 2e 72 69 64 3d 25 64 22 0a 20 20 20 20  ref.rid=%d".    
4bc0: 22 20 4f 52 44 45 52 20 42 59 20 74 61 67 6e 61  " ORDER BY tagna
4bd0: 6d 65 20 2f 2a 73 6f 72 74 2a 2f 22 2c 20 72 69  me /*sort*/", ri
4be0: 64 2c 20 72 69 64 2c 20 72 69 64 0a 20 20 29 3b  d, rid, rid.  );
4bf0: 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 73 71  .  blob_zero(&sq
4c00: 6c 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e  l);.  blob_appen
4c10: 64 28 26 73 71 6c 2c 20 74 69 6d 65 6c 69 6e 65  d(&sql, timeline
4c20: 5f 71 75 65 72 79 5f 66 6f 72 5f 77 77 77 28 29  _query_for_www()
4c30: 2c 20 2d 31 29 3b 0a 20 20 62 6c 6f 62 5f 61 70  , -1);.  blob_ap
4c40: 70 65 6e 64 5f 73 71 6c 28 26 73 71 6c 2c 20 22  pend_sql(&sql, "
4c50: 20 41 4e 44 20 65 76 65 6e 74 2e 6f 62 6a 69 64   AND event.objid
4c60: 20 49 4e 20 6f 6b 20 4f 52 44 45 52 20 42 59 20   IN ok ORDER BY 
4c70: 6d 74 69 6d 65 20 44 45 53 43 22 29 3b 0a 20 20  mtime DESC");.  
4c80: 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 22  db_prepare(&q, "
4c90: 25 73 22 2c 20 62 6c 6f 62 5f 73 71 6c 5f 74 65  %s", blob_sql_te
4ca0: 78 74 28 26 73 71 6c 29 29 3b 0a 20 20 77 77 77  xt(&sql));.  www
4cb0: 5f 70 72 69 6e 74 5f 74 69 6d 65 6c 69 6e 65 28  _print_timeline(
4cc0: 26 71 2c 20 54 49 4d 45 4c 49 4e 45 5f 44 49 53  &q, TIMELINE_DIS
4cd0: 4a 4f 49 4e 54 7c 54 49 4d 45 4c 49 4e 45 5f 47  JOINT|TIMELINE_G
4ce0: 52 41 50 48 7c 54 49 4d 45 4c 49 4e 45 5f 4e 4f  RAPH|TIMELINE_NO
4cf0: 53 43 52 4f 4c 4c 2c 0a 20 20 20 20 20 20 20 20  SCROLL,.        
4d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
4d10: 30 2c 20 72 69 64 2c 20 30 29 3b 0a 20 20 64 62  0, rid, 0);.  db
4d20: 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20  _finalize(&q);. 
4d30: 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b   style_footer();
4d40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47  .}../*.** WEBPAG
4d50: 45 3a 20 76 69 6e 66 6f 0a 2a 2a 20 57 45 42 50  E: vinfo.** WEBP
4d60: 41 47 45 3a 20 63 69 0a 2a 2a 20 55 52 4c 3a 20  AGE: ci.** URL: 
4d70: 20 2f 63 69 2f 41 52 54 49 46 41 43 54 49 44 0a   /ci/ARTIFACTID.
4d80: 2a 2a 20 20 4f 52 3a 20 20 2f 63 69 3f 6e 61 6d  **  OR:  /ci?nam
4d90: 65 3d 41 52 54 49 46 41 43 54 49 44 0a 2a 2a 0a  e=ARTIFACTID.**.
4da0: 2a 2a 20 44 69 73 70 6c 61 79 20 69 6e 66 6f 72  ** Display infor
4db0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20 70  mation about a p
4dc0: 61 72 74 69 63 75 6c 61 72 20 63 68 65 63 6b 2d  articular check-
4dd0: 69 6e 2e 20 20 54 68 65 20 65 78 61 63 74 0a 2a  in.  The exact.*
4de0: 2a 20 73 61 6d 65 20 69 6e 66 6f 72 6d 61 74 69  * same informati
4df0: 6f 6e 20 69 73 20 73 68 6f 77 6e 20 6f 6e 20 74  on is shown on t
4e00: 68 65 20 2f 69 6e 66 6f 20 70 61 67 65 20 69 66  he /info page if
4e10: 20 74 68 65 20 6e 61 6d 65 20 71 75 65 72 79 0a   the name query.
4e20: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  ** parameter to 
4e30: 2f 69 6e 66 6f 20 64 65 73 63 72 69 62 65 73 20  /info describes 
4e40: 61 20 63 68 65 63 6b 2d 69 6e 2e 0a 2a 2a 0a 2a  a check-in..**.*
4e50: 2a 20 54 68 65 20 41 52 54 49 46 41 43 54 49 44  * The ARTIFACTID
4e60: 20 63 61 6e 20 62 65 20 61 20 75 6e 69 71 75 65   can be a unique
4e70: 20 70 72 65 66 69 78 20 66 6f 72 20 74 68 65 20   prefix for the 
4e80: 48 41 53 48 20 6f 66 20 74 68 65 20 63 68 65 63  HASH of the chec
4e90: 6b 2d 69 6e 2c 0a 2a 2a 20 6f 72 20 61 20 74 61  k-in,.** or a ta
4ea0: 67 20 6f 72 20 62 72 61 6e 63 68 20 6e 61 6d 65  g or branch name
4eb0: 20 74 68 61 74 20 69 64 65 6e 74 69 66 69 65 73   that identifies
4ec0: 20 74 68 65 20 63 68 65 63 6b 2d 69 6e 2e 0a 2a   the check-in..*
4ed0: 2f 0a 76 6f 69 64 20 63 69 5f 70 61 67 65 28 76  /.void ci_page(v
4ee0: 6f 69 64 29 7b 0a 20 20 53 74 6d 74 20 71 31 2c  oid){.  Stmt q1,
4ef0: 20 71 32 2c 20 71 33 3b 0a 20 20 69 6e 74 20 72   q2, q3;.  int r
4f00: 69 64 3b 0a 20 20 69 6e 74 20 69 73 4c 65 61 66  id;.  int isLeaf
4f10: 3b 0a 20 20 69 6e 74 20 64 69 66 66 54 79 70 65  ;.  int diffType
4f20: 3b 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 6e  ;        /* 0: n
4f30: 6f 20 64 69 66 66 2c 20 20 31 3a 20 75 6e 69 66  o diff,  1: unif
4f40: 69 65 64 2c 20 20 32 3a 20 73 69 64 65 2d 62 79  ied,  2: side-by
4f50: 2d 73 69 64 65 20 2a 2f 0a 20 20 75 36 34 20 64  -side */.  u64 d
4f60: 69 66 66 46 6c 61 67 73 3b 20 20 20 20 20 20 20  iffFlags;       
4f70: 2f 2a 20 46 6c 61 67 20 70 61 72 61 6d 65 74 65  /* Flag paramete
4f80: 72 20 66 6f 72 20 74 65 78 74 5f 64 69 66 66 28  r for text_diff(
4f90: 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  ) */.  const cha
4fa0: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e  r *zName;   /* N
4fb0: 61 6d 65 20 6f 66 20 74 68 65 20 63 68 65 63 6b  ame of the check
4fc0: 2d 69 6e 20 74 6f 20 62 65 20 64 69 73 70 6c 61  -in to be displa
4fd0: 79 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  yed */.  const c
4fe0: 68 61 72 20 2a 7a 55 75 69 64 3b 20 20 20 2f 2a  har *zUuid;   /*
4ff0: 20 55 55 49 44 20 6f 66 20 7a 4e 61 6d 65 20 2a   UUID of zName *
5000: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
5010: 7a 50 61 72 65 6e 74 3b 20 2f 2a 20 55 55 49 44  zParent; /* UUID
5020: 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 63   of the parent c
5030: 68 65 63 6b 2d 69 6e 20 28 69 66 20 61 6e 79 29  heck-in (if any)
5040: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
5050: 20 2a 7a 52 65 3b 20 20 20 20 20 2f 2a 20 72 65   *zRe;     /* re
5060: 67 65 78 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  gex parameter */
5070: 0a 20 20 52 65 43 6f 6d 70 69 6c 65 64 20 2a 70  .  ReCompiled *p
5080: 52 65 20 3d 20 30 3b 20 2f 2a 20 72 65 67 65 78  Re = 0; /* regex
5090: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
50a0: 20 2a 7a 57 3b 20 20 20 20 20 20 2f 2a 20 55 52   *zW;      /* UR
50b0: 4c 20 70 61 72 61 6d 20 66 6f 72 20 69 67 6e 6f  L param for igno
50c0: 72 69 6e 67 20 77 68 69 74 65 73 70 61 63 65 20  ring whitespace 
50d0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
50e0: 2a 7a 50 61 67 65 20 3d 20 22 76 69 6e 66 6f 22  *zPage = "vinfo"
50f0: 3b 20 20 2f 2a 20 50 61 67 65 20 74 68 61 74 20  ;  /* Page that 
5100: 73 68 6f 77 73 20 64 69 66 66 73 20 2a 2f 0a 20  shows diffs */. 
5110: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
5120: 67 65 48 69 64 65 20 3d 20 22 63 69 22 3b 20 2f  geHide = "ci"; /
5130: 2a 20 50 61 67 65 20 74 68 61 74 20 68 69 64 65  * Page that hide
5140: 73 20 64 69 66 66 73 20 2a 2f 0a 0a 20 20 6c 6f  s diffs */..  lo
5150: 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e  gin_check_creden
5160: 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28 20 21  tials();.  if( !
5170: 67 2e 70 65 72 6d 2e 52 65 61 64 20 29 7b 20 6c  g.perm.Read ){ l
5180: 6f 67 69 6e 5f 6e 65 65 64 65 64 28 67 2e 61 6e  ogin_needed(g.an
5190: 6f 6e 2e 52 65 61 64 29 3b 20 72 65 74 75 72 6e  on.Read); return
51a0: 3b 20 7d 0a 20 20 7a 4e 61 6d 65 20 3d 20 50 28  ; }.  zName = P(
51b0: 22 6e 61 6d 65 22 29 3b 0a 20 20 72 69 64 20 3d  "name");.  rid =
51c0: 20 6e 61 6d 65 5f 74 6f 5f 72 69 64 5f 77 77 77   name_to_rid_www
51d0: 28 22 6e 61 6d 65 22 29 3b 0a 20 20 69 66 28 20  ("name");.  if( 
51e0: 72 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  rid==0 ){.    st
51f0: 79 6c 65 5f 68 65 61 64 65 72 28 22 43 68 65 63  yle_header("Chec
5200: 6b 2d 69 6e 20 49 6e 66 6f 72 6d 61 74 69 6f 6e  k-in Information
5210: 20 45 72 72 6f 72 22 29 3b 0a 20 20 20 20 40 20   Error");.    @ 
5220: 4e 6f 20 73 75 63 68 20 6f 62 6a 65 63 74 3a 20  No such object: 
5230: 25 68 28 67 2e 61 72 67 76 5b 32 5d 29 0a 20 20  %h(g.argv[2]).  
5240: 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29    style_footer()
5250: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
5260: 7d 0a 20 20 7a 52 65 20 3d 20 50 28 22 72 65 67  }.  zRe = P("reg
5270: 65 78 22 29 3b 0a 20 20 69 66 28 20 7a 52 65 20  ex");.  if( zRe 
5280: 29 20 72 65 5f 63 6f 6d 70 69 6c 65 28 26 70 52  ) re_compile(&pR
5290: 65 2c 20 7a 52 65 2c 20 30 29 3b 0a 20 20 7a 55  e, zRe, 0);.  zU
52a0: 75 69 64 20 3d 20 64 62 5f 74 65 78 74 28 30 2c  uid = db_text(0,
52b0: 20 22 53 45 4c 45 43 54 20 75 75 69 64 20 46 52   "SELECT uuid FR
52c0: 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69  OM blob WHERE ri
52d0: 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 7a  d=%d", rid);.  z
52e0: 50 61 72 65 6e 74 20 3d 20 64 62 5f 74 65 78 74  Parent = db_text
52f0: 28 30 2c 0a 20 20 20 20 22 53 45 4c 45 43 54 20  (0,.    "SELECT 
5300: 75 75 69 64 20 46 52 4f 4d 20 70 6c 69 6e 6b 2c  uuid FROM plink,
5310: 20 62 6c 6f 62 22 0a 20 20 20 20 22 20 57 48 45   blob".    " WHE
5320: 52 45 20 70 6c 69 6e 6b 2e 63 69 64 3d 25 64 20  RE plink.cid=%d 
5330: 41 4e 44 20 62 6c 6f 62 2e 72 69 64 3d 70 6c 69  AND blob.rid=pli
5340: 6e 6b 2e 70 69 64 20 41 4e 44 20 70 6c 69 6e 6b  nk.pid AND plink
5350: 2e 69 73 70 72 69 6d 22 2c 0a 20 20 20 20 72 69  .isprim",.    ri
5360: 64 0a 20 20 29 3b 0a 20 20 69 73 4c 65 61 66 20  d.  );.  isLeaf 
5370: 3d 20 21 64 62 5f 65 78 69 73 74 73 28 22 53 45  = !db_exists("SE
5380: 4c 45 43 54 20 31 20 46 52 4f 4d 20 70 6c 69 6e  LECT 1 FROM plin
5390: 6b 20 57 48 45 52 45 20 70 69 64 3d 25 64 22 2c  k WHERE pid=%d",
53a0: 20 72 69 64 29 3b 0a 20 20 64 62 5f 70 72 65 70   rid);.  db_prep
53b0: 61 72 65 28 26 71 31 2c 0a 20 20 20 20 20 22 53  are(&q1,.     "S
53c0: 45 4c 45 43 54 20 75 75 69 64 2c 20 64 61 74 65  ELECT uuid, date
53d0: 74 69 6d 65 28 6d 74 69 6d 65 2c 74 6f 4c 6f 63  time(mtime,toLoc
53e0: 61 6c 28 29 29 2c 20 75 73 65 72 2c 20 63 6f 6d  al()), user, com
53f0: 6d 65 6e 74 2c 22 0a 20 20 20 20 20 22 20 20 20  ment,".     "   
5400: 20 20 20 20 64 61 74 65 74 69 6d 65 28 6f 6d 74      datetime(omt
5410: 69 6d 65 2c 74 6f 4c 6f 63 61 6c 28 29 29 2c 20  ime,toLocal()), 
5420: 6d 74 69 6d 65 22 0a 20 20 20 20 20 22 20 20 46  mtime".     "  F
5430: 52 4f 4d 20 62 6c 6f 62 2c 20 65 76 65 6e 74 22  ROM blob, event"
5440: 0a 20 20 20 20 20 22 20 57 48 45 52 45 20 62 6c  .     " WHERE bl
5450: 6f 62 2e 72 69 64 3d 25 64 22 0a 20 20 20 20 20  ob.rid=%d".     
5460: 22 20 20 20 41 4e 44 20 65 76 65 6e 74 2e 6f 62  "   AND event.ob
5470: 6a 69 64 3d 25 64 22 2c 0a 20 20 20 20 20 72 69  jid=%d",.     ri
5480: 64 2c 20 72 69 64 0a 20 20 29 3b 0a 20 20 0a 20  d, rid.  );.  . 
5490: 20 63 6f 6f 6b 69 65 5f 6c 69 6e 6b 5f 70 61 72   cookie_link_par
54a0: 61 6d 65 74 65 72 28 22 64 69 66 66 22 2c 22 64  ameter("diff","d
54b0: 69 66 66 22 2c 22 32 22 29 3b 0a 20 20 64 69 66  iff","2");.  dif
54c0: 66 54 79 70 65 20 3d 20 61 74 6f 69 28 50 44 28  fType = atoi(PD(
54d0: 22 64 69 66 66 22 2c 22 32 22 29 29 3b 0a 20 20  "diff","2"));.  
54e0: 69 66 28 20 64 62 5f 73 74 65 70 28 26 71 31 29  if( db_step(&q1)
54f0: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
5500: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
5510: 7a 55 75 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d  zUuid = db_colum
5520: 6e 5f 74 65 78 74 28 26 71 31 2c 20 30 29 3b 0a  n_text(&q1, 0);.
5530: 20 20 20 20 69 6e 74 20 6e 55 75 69 64 20 3d 20      int nUuid = 
5540: 64 62 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  db_column_bytes(
5550: 26 71 31 2c 20 30 29 3b 0a 20 20 20 20 63 68 61  &q1, 0);.    cha
5560: 72 20 2a 7a 45 55 73 65 72 2c 20 2a 7a 45 43 6f  r *zEUser, *zECo
5570: 6d 6d 65 6e 74 3b 0a 20 20 20 20 63 6f 6e 73 74  mment;.    const
5580: 20 63 68 61 72 20 2a 7a 55 73 65 72 3b 0a 20 20   char *zUser;.  
5590: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
55a0: 72 69 67 55 73 65 72 3b 0a 20 20 20 20 63 6f 6e  rigUser;.    con
55b0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 65 6e  st char *zCommen
55c0: 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  t;.    const cha
55d0: 72 20 2a 7a 44 61 74 65 3b 0a 20 20 20 20 63 6f  r *zDate;.    co
55e0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44  nst char *zOrigD
55f0: 61 74 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ate;.    const c
5600: 68 61 72 20 2a 7a 42 72 4e 61 6d 65 3b 0a 20 20  har *zBrName;.  
5610: 20 20 69 6e 74 20 6f 6b 57 69 6b 69 20 3d 20 30    int okWiki = 0
5620: 3b 0a 20 20 20 20 42 6c 6f 62 20 77 69 6b 69 5f  ;.    Blob wiki_
5630: 72 65 61 64 5f 6c 69 6e 6b 73 20 3d 20 42 4c 4f  read_links = BLO
5640: 42 5f 49 4e 49 54 49 41 4c 49 5a 45 52 3b 0a 20  B_INITIALIZER;. 
5650: 20 20 20 42 6c 6f 62 20 77 69 6b 69 5f 61 64 64     Blob wiki_add
5660: 5f 6c 69 6e 6b 73 20 3d 20 42 4c 4f 42 5f 49 4e  _links = BLOB_IN
5670: 49 54 49 41 4c 49 5a 45 52 3b 0a 0a 20 20 20 20  ITIALIZER;..    
5680: 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22 43 68  style_header("Ch
5690: 65 63 6b 2d 69 6e 20 5b 25 53 5d 22 2c 20 7a 55  eck-in [%S]", zU
56a0: 75 69 64 29 3b 0a 20 20 20 20 6c 6f 67 69 6e 5f  uid);.    login_
56b0: 61 6e 6f 6e 79 6d 6f 75 73 5f 61 76 61 69 6c 61  anonymous_availa
56c0: 62 6c 65 28 29 3b 0a 20 20 20 20 7a 45 55 73 65  ble();.    zEUse
56d0: 72 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 0a 20  r = db_text(0,. 
56e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56f0: 20 20 22 53 45 4c 45 43 54 20 76 61 6c 75 65 20    "SELECT value 
5700: 46 52 4f 4d 20 74 61 67 78 72 65 66 22 0a 20 20  FROM tagxref".  
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 20 22 20 57 48 45 52 45 20 74 61 67 69 64 3d 25   " WHERE tagid=%
5730: 64 20 41 4e 44 20 72 69 64 3d 25 64 20 41 4e 44  d AND rid=%d AND
5740: 20 74 61 67 74 79 70 65 3e 30 22 2c 0a 20 20 20   tagtype>0",.   
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5760: 20 54 41 47 5f 55 53 45 52 2c 20 72 69 64 29 3b   TAG_USER, rid);
5770: 0a 20 20 20 20 7a 45 43 6f 6d 6d 65 6e 74 20 3d  .    zEComment =
5780: 20 64 62 5f 74 65 78 74 28 30 2c 0a 20 20 20 20   db_text(0,.    
5790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
57a0: 53 45 4c 45 43 54 20 76 61 6c 75 65 20 46 52 4f  SELECT value FRO
57b0: 4d 20 74 61 67 78 72 65 66 20 57 48 45 52 45 20  M tagxref WHERE 
57c0: 74 61 67 69 64 3d 25 64 20 41 4e 44 20 72 69 64  tagid=%d AND rid
57d0: 3d 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%d",.          
57e0: 20 20 20 20 20 20 20 20 20 54 41 47 5f 43 4f 4d           TAG_COM
57f0: 4d 45 4e 54 2c 20 72 69 64 29 3b 0a 20 20 20 20  MENT, rid);.    
5800: 7a 42 72 4e 61 6d 65 20 3d 20 64 62 5f 74 65 78  zBrName = db_tex
5810: 74 28 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  t(0,.           
5820: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
5830: 76 61 6c 75 65 20 46 52 4f 4d 20 74 61 67 78 72  value FROM tagxr
5840: 65 66 20 57 48 45 52 45 20 74 61 67 69 64 3d 25  ef WHERE tagid=%
5850: 64 20 41 4e 44 20 72 69 64 3d 25 64 22 2c 0a 20  d AND rid=%d",. 
5860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5870: 20 20 54 41 47 5f 42 52 41 4e 43 48 2c 20 72 69    TAG_BRANCH, ri
5880: 64 29 3b 0a 20 20 20 20 7a 4f 72 69 67 55 73 65  d);.    zOrigUse
5890: 72 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65  r = db_column_te
58a0: 78 74 28 26 71 31 2c 20 32 29 3b 0a 20 20 20 20  xt(&q1, 2);.    
58b0: 7a 55 73 65 72 20 3d 20 7a 45 55 73 65 72 20 3f  zUser = zEUser ?
58c0: 20 7a 45 55 73 65 72 20 3a 20 7a 4f 72 69 67 55   zEUser : zOrigU
58d0: 73 65 72 3b 0a 20 20 20 20 7a 43 6f 6d 6d 65 6e  ser;.    zCommen
58e0: 74 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65  t = db_column_te
58f0: 78 74 28 26 71 31 2c 20 33 29 3b 0a 20 20 20 20  xt(&q1, 3);.    
5900: 7a 44 61 74 65 20 3d 20 64 62 5f 63 6f 6c 75 6d  zDate = db_colum
5910: 6e 5f 74 65 78 74 28 26 71 31 2c 31 29 3b 0a 20  n_text(&q1,1);. 
5920: 20 20 20 7a 4f 72 69 67 44 61 74 65 20 3d 20 64     zOrigDate = d
5930: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
5940: 31 2c 20 34 29 3b 0a 20 20 20 20 69 66 28 20 7a  1, 4);.    if( z
5950: 4f 72 69 67 44 61 74 65 3d 3d 30 20 29 20 7a 4f  OrigDate==0 ) zO
5960: 72 69 67 44 61 74 65 20 3d 20 7a 44 61 74 65 3b  rigDate = zDate;
5970: 0a 20 20 20 20 40 20 3c 64 69 76 20 63 6c 61 73  .    @ <div clas
5980: 73 3d 22 73 65 63 74 69 6f 6e 22 3e 4f 76 65 72  s="section">Over
5990: 76 69 65 77 3c 2f 64 69 76 3e 0a 20 20 20 20 40  view</div>.    @
59a0: 20 3c 74 61 62 6c 65 20 63 6c 61 73 73 3d 22 6c   <table class="l
59b0: 61 62 65 6c 2d 76 61 6c 75 65 22 3e 0a 20 20 20  abel-value">.   
59c0: 20 40 20 3c 74 72 3e 3c 74 68 3e 43 6f 6d 6d 65   @ <tr><th>Comme
59d0: 6e 74 3a 3c 2f 74 68 3e 3c 74 64 20 63 6c 61 73  nt:</th><td clas
59e0: 73 3d 22 69 6e 66 6f 43 6f 6d 6d 65 6e 74 22 3e  s="infoComment">
59f0: 5c 0a 20 20 20 20 40 20 25 21 57 28 7a 45 43 6f  \.    @ %!W(zECo
5a00: 6d 6d 65 6e 74 3f 7a 45 43 6f 6d 6d 65 6e 74 3a  mment?zEComment:
5a10: 7a 43 6f 6d 6d 65 6e 74 29 3c 2f 74 64 3e 3c 2f  zComment)</td></
5a20: 74 72 3e 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  tr>..    /* The 
5a30: 44 6f 77 6e 6c 6f 61 64 3a 20 6c 69 6e 65 20 2a  Download: line *
5a40: 2f 0a 20 20 20 20 69 66 28 20 67 2e 70 65 72 6d  /.    if( g.perm
5a50: 2e 5a 69 70 20 20 29 7b 0a 20 20 20 20 20 20 63  .Zip  ){.      c
5a60: 68 61 72 20 2a 7a 50 4a 20 3d 20 64 62 5f 67 65  har *zPJ = db_ge
5a70: 74 28 22 73 68 6f 72 74 2d 70 72 6f 6a 65 63 74  t("short-project
5a80: 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20 20 20  -name", 0);.    
5a90: 20 20 63 68 61 72 20 2a 7a 55 72 6c 3b 0a 20 20    char *zUrl;.  
5aa0: 20 20 20 20 42 6c 6f 62 20 70 72 6f 6a 4e 61 6d      Blob projNam
5ab0: 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 6a 3b  e;.      int jj;
5ac0: 0a 20 20 20 20 20 20 69 66 28 20 7a 50 4a 3d 3d  .      if( zPJ==
5ad0: 30 20 29 20 7a 50 4a 20 3d 20 64 62 5f 67 65 74  0 ) zPJ = db_get
5ae0: 28 22 70 72 6f 6a 65 63 74 2d 6e 61 6d 65 22 2c  ("project-name",
5af0: 20 22 75 6e 6e 61 6d 65 64 22 29 3b 0a 20 20 20   "unnamed");.   
5b00: 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 70 72     blob_zero(&pr
5b10: 6f 6a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  ojName);.      b
5b20: 6c 6f 62 5f 61 70 70 65 6e 64 28 26 70 72 6f 6a  lob_append(&proj
5b30: 4e 61 6d 65 2c 20 7a 50 4a 2c 20 2d 31 29 3b 0a  Name, zPJ, -1);.
5b40: 20 20 20 20 20 20 62 6c 6f 62 5f 74 72 69 6d 28        blob_trim(
5b50: 26 70 72 6f 6a 4e 61 6d 65 29 3b 0a 20 20 20 20  &projName);.    
5b60: 20 20 7a 50 4a 20 3d 20 62 6c 6f 62 5f 73 74 72    zPJ = blob_str
5b70: 28 26 70 72 6f 6a 4e 61 6d 65 29 3b 0a 20 20 20  (&projName);.   
5b80: 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 7a 50 4a     for(jj=0; zPJ
5b90: 5b 6a 6a 5d 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20  [jj]; jj++){.   
5ba0: 20 20 20 20 20 69 66 28 20 28 7a 50 4a 5b 6a 6a       if( (zPJ[jj
5bb0: 5d 3e 30 20 26 26 20 7a 50 4a 5b 6a 6a 5d 3c 27  ]>0 && zPJ[jj]<'
5bc0: 20 27 29 20 7c 7c 20 73 74 72 63 68 72 28 22 5c   ') || strchr("\
5bd0: 22 2a 2f 3a 3c 3e 3f 5c 5c 7c 22 2c 20 7a 50 4a  "*/:<>?\\|", zPJ
5be0: 5b 6a 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  [jj]) ){.       
5bf0: 20 20 20 7a 50 4a 5b 6a 6a 5d 20 3d 20 27 5f 27     zPJ[jj] = '_'
5c00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5c10: 20 20 7d 0a 20 20 20 20 20 20 7a 55 72 6c 20 3d    }.      zUrl =
5c20: 20 6d 70 72 69 6e 74 66 28 22 25 52 2f 74 61 72   mprintf("%R/tar
5c30: 62 61 6c 6c 2f 25 53 2f 25 74 2d 25 53 2e 74 61  ball/%S/%t-%S.ta
5c40: 72 2e 67 7a 22 2c 20 7a 55 75 69 64 2c 20 7a 50  r.gz", zUuid, zP
5c50: 4a 2c 20 7a 55 75 69 64 29 3b 0a 20 20 20 20 20  J, zUuid);.     
5c60: 20 40 20 3c 74 72 3e 3c 74 68 3e 44 6f 77 6e 6c   @ <tr><th>Downl
5c70: 6f 61 64 73 3a 3c 2f 74 68 3e 3c 74 64 3e 0a 20  oads:</th><td>. 
5c80: 20 20 20 20 20 40 20 25 7a 28 68 72 65 66 28 22       @ %z(href("
5c90: 25 73 22 2c 7a 55 72 6c 29 29 54 61 72 62 61 6c  %s",zUrl))Tarbal
5ca0: 6c 3c 2f 61 3e 0a 20 20 20 20 20 20 40 20 7c 20  l</a>.      @ | 
5cb0: 25 7a 28 68 72 65 66 28 22 25 52 2f 7a 69 70 2f  %z(href("%R/zip/
5cc0: 25 53 2f 25 74 2d 25 53 2e 7a 69 70 22 2c 7a 55  %S/%t-%S.zip",zU
5cd0: 75 69 64 2c 20 7a 50 4a 2c 7a 55 75 69 64 29 29  uid, zPJ,zUuid))
5ce0: 5a 49 50 20 61 72 63 68 69 76 65 3c 2f 61 3e 0a  ZIP archive</a>.
5cf0: 20 20 20 20 20 20 40 20 7c 20 25 7a 28 68 72 65        @ | %z(hre
5d00: 66 28 22 25 52 2f 73 71 6c 61 72 2f 25 53 2f 25  f("%R/sqlar/%S/%
5d10: 74 2d 25 53 2e 73 71 6c 61 72 22 2c 7a 55 75 69  t-%S.sqlar",zUui
5d20: 64 2c 7a 50 4a 2c 7a 55 75 69 64 29 29 5c 0a 20  d,zPJ,zUuid))\. 
5d30: 20 20 20 20 20 40 20 53 51 4c 20 61 72 63 68 69       @ SQL archi
5d40: 76 65 3c 2f 61 3e 3c 2f 74 64 3e 3c 2f 74 72 3e  ve</a></td></tr>
5d50: 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 72  .      fossil_fr
5d60: 65 65 28 7a 55 72 6c 29 3b 0a 20 20 20 20 20 20  ee(zUrl);.      
5d70: 62 6c 6f 62 5f 72 65 73 65 74 28 26 70 72 6f 6a  blob_reset(&proj
5d80: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Name);.    }..  
5d90: 20 20 40 20 3c 74 72 3e 3c 74 68 3e 54 69 6d 65    @ <tr><th>Time
5da0: 6c 69 6e 65 73 3a 3c 2f 74 68 3e 3c 74 64 3e 0a  lines:</th><td>.
5db0: 20 20 20 20 40 20 20 20 25 7a 28 68 72 65 66 28      @   %z(href(
5dc0: 22 25 52 2f 74 69 6d 65 6c 69 6e 65 3f 66 3d 25  "%R/timeline?f=%
5dd0: 21 53 26 75 6e 68 69 64 65 22 2c 7a 55 75 69 64  !S&unhide",zUuid
5de0: 29 29 66 61 6d 69 6c 79 3c 2f 61 3e 0a 20 20 20  ))family</a>.   
5df0: 20 69 66 28 20 7a 50 61 72 65 6e 74 20 29 7b 0a   if( zParent ){.
5e00: 20 20 20 20 20 20 40 20 7c 20 25 7a 28 68 72 65        @ | %z(hre
5e10: 66 28 22 25 52 2f 74 69 6d 65 6c 69 6e 65 3f 70  f("%R/timeline?p
5e20: 3d 25 21 53 26 75 6e 68 69 64 65 22 2c 7a 55 75  =%!S&unhide",zUu
5e30: 69 64 29 29 61 6e 63 65 73 74 6f 72 73 3c 2f 61  id))ancestors</a
5e40: 3e 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  >.    }.    if( 
5e50: 21 69 73 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  !isLeaf ){.     
5e60: 20 40 20 7c 20 25 7a 28 68 72 65 66 28 22 25 52   @ | %z(href("%R
5e70: 2f 74 69 6d 65 6c 69 6e 65 3f 64 3d 25 21 53 26  /timeline?d=%!S&
5e80: 75 6e 68 69 64 65 22 2c 7a 55 75 69 64 29 29 64  unhide",zUuid))d
5e90: 65 73 63 65 6e 64 61 6e 74 73 3c 2f 61 3e 0a 20  escendants</a>. 
5ea0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 50 61     }.    if( zPa
5eb0: 72 65 6e 74 20 26 26 20 21 69 73 4c 65 61 66 20  rent && !isLeaf 
5ec0: 29 7b 0a 20 20 20 20 20 20 40 20 7c 20 25 7a 28  ){.      @ | %z(
5ed0: 68 72 65 66 28 22 25 52 2f 74 69 6d 65 6c 69 6e  href("%R/timelin
5ee0: 65 3f 64 70 3d 25 21 53 26 75 6e 68 69 64 65 22  e?dp=%!S&unhide"
5ef0: 2c 7a 55 75 69 64 29 29 62 6f 74 68 3c 2f 61 3e  ,zUuid))both</a>
5f00: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 5f 70 72  .    }.    db_pr
5f10: 65 70 61 72 65 28 26 71 32 2c 22 53 45 4c 45 43  epare(&q2,"SELEC
5f20: 54 20 73 75 62 73 74 72 28 74 61 67 2e 74 61 67  T substr(tag.tag
5f30: 6e 61 6d 65 2c 35 29 20 46 52 4f 4d 20 74 61 67  name,5) FROM tag
5f40: 78 72 65 66 2c 20 74 61 67 20 22 0a 20 20 20 20  xref, tag ".    
5f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
5f60: 20 57 48 45 52 45 20 72 69 64 3d 25 64 20 41 4e   WHERE rid=%d AN
5f70: 44 20 74 61 67 74 79 70 65 3e 30 20 22 0a 20 20  D tagtype>0 ".  
5f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f90: 20 22 20 20 20 41 4e 44 20 74 61 67 2e 74 61 67   "   AND tag.tag
5fa0: 69 64 3d 74 61 67 78 72 65 66 2e 74 61 67 69 64  id=tagxref.tagid
5fb0: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
5fc0: 20 20 20 20 20 20 22 20 20 20 41 4e 44 20 2b 74        "   AND +t
5fd0: 61 67 2e 74 61 67 6e 61 6d 65 20 47 4c 4f 42 20  ag.tagname GLOB 
5fe0: 27 73 79 6d 2d 2a 27 22 2c 20 72 69 64 29 3b 0a  'sym-*'", rid);.
5ff0: 20 20 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74      while( db_st
6000: 65 70 28 26 71 32 29 3d 3d 53 51 4c 49 54 45 5f  ep(&q2)==SQLITE_
6010: 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ROW ){.      con
6020: 73 74 20 63 68 61 72 20 2a 7a 54 61 67 4e 61 6d  st char *zTagNam
6030: 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65  e = db_column_te
6040: 78 74 28 26 71 32 2c 20 30 29 3b 0a 20 20 20 20  xt(&q2, 0);.    
6050: 20 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 72    if( fossil_str
6060: 63 6d 70 28 7a 54 61 67 4e 61 6d 65 2c 7a 42 72  cmp(zTagName,zBr
6070: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
6080: 20 20 20 20 40 20 20 7c 20 25 7a 28 68 72 65 66      @  | %z(href
6090: 28 22 25 52 2f 74 69 6d 65 6c 69 6e 65 3f 72 3d  ("%R/timeline?r=
60a0: 25 54 26 75 6e 68 69 64 65 22 2c 7a 54 61 67 4e  %T&unhide",zTagN
60b0: 61 6d 65 29 29 25 68 28 7a 54 61 67 4e 61 6d 65  ame))%h(zTagName
60c0: 29 3c 2f 61 3e 0a 20 20 20 20 20 20 20 20 69 66  )</a>.        if
60d0: 28 20 77 69 6b 69 5f 74 61 67 69 64 32 28 22 62  ( wiki_tagid2("b
60e0: 72 61 6e 63 68 22 2c 7a 54 61 67 4e 61 6d 65 29  ranch",zTagName)
60f0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
6100: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77   blob_appendf(&w
6110: 69 6b 69 5f 72 65 61 64 5f 6c 69 6e 6b 73 2c 20  iki_read_links, 
6120: 22 20 7c 20 25 7a 25 68 3c 2f 61 3e 22 2c 0a 20  " | %z%h</a>",. 
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 68 72 65               hre
6140: 66 28 22 25 52 2f 77 69 6b 69 3f 6e 61 6d 65 3d  f("%R/wiki?name=
6150: 62 72 61 6e 63 68 2f 25 68 22 2c 7a 54 61 67 4e  branch/%h",zTagN
6160: 61 6d 65 29 2c 20 7a 54 61 67 4e 61 6d 65 29 3b  ame), zTagName);
6170: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
6180: 66 28 20 67 2e 70 65 72 6d 2e 57 72 69 74 65 20  f( g.perm.Write 
6190: 26 26 20 67 2e 70 65 72 6d 2e 57 72 57 69 6b 69  && g.perm.WrWiki
61a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 6c   ){.          bl
61b0: 6f 62 5f 61 70 70 65 6e 64 66 28 26 77 69 6b 69  ob_appendf(&wiki
61c0: 5f 61 64 64 5f 6c 69 6e 6b 73 2c 20 22 20 7c 20  _add_links, " | 
61d0: 25 7a 25 68 3c 2f 61 3e 22 2c 0a 20 20 20 20 20  %z%h</a>",.     
61e0: 20 20 20 20 20 20 20 20 20 68 72 65 66 28 22 25           href("%
61f0: 52 2f 77 69 6b 69 65 64 69 74 3f 6e 61 6d 65 3d  R/wikiedit?name=
6200: 62 72 61 6e 63 68 2f 25 68 22 2c 7a 54 61 67 4e  branch/%h",zTagN
6210: 61 6d 65 29 2c 20 7a 54 61 67 4e 61 6d 65 29 3b  ame), zTagName);
6220: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6230: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6240: 40 20 20 7c 20 25 7a 28 68 72 65 66 28 22 25 52  @  | %z(href("%R
6250: 2f 74 69 6d 65 6c 69 6e 65 3f 74 3d 25 54 26 75  /timeline?t=%T&u
6260: 6e 68 69 64 65 22 2c 7a 54 61 67 4e 61 6d 65 29  nhide",zTagName)
6270: 29 25 68 28 7a 54 61 67 4e 61 6d 65 29 3c 2f 61  )%h(zTagName)</a
6280: 3e 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 69  >.        if( wi
6290: 6b 69 5f 74 61 67 69 64 32 28 22 74 61 67 22 2c  ki_tagid2("tag",
62a0: 7a 54 61 67 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  zTagName)!=0 ){.
62b0: 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61            blob_a
62c0: 70 70 65 6e 64 66 28 26 77 69 6b 69 5f 72 65 61  ppendf(&wiki_rea
62d0: 64 5f 6c 69 6e 6b 73 2c 20 22 20 7c 20 25 7a 25  d_links, " | %z%
62e0: 68 3c 2f 61 3e 22 2c 0a 20 20 20 20 20 20 20 20  h</a>",.        
62f0: 20 20 20 20 20 20 68 72 65 66 28 22 25 52 2f 77        href("%R/w
6300: 69 6b 69 3f 6e 61 6d 65 3d 74 61 67 2f 25 68 22  iki?name=tag/%h"
6310: 2c 7a 54 61 67 4e 61 6d 65 29 2c 20 7a 54 61 67  ,zTagName), zTag
6320: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Name);.        }
6330: 65 6c 73 65 20 69 66 28 20 67 2e 70 65 72 6d 2e  else if( g.perm.
6340: 57 72 69 74 65 20 26 26 20 67 2e 70 65 72 6d 2e  Write && g.perm.
6350: 57 72 57 69 6b 69 20 29 7b 0a 20 20 20 20 20 20  WrWiki ){.      
6360: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66      blob_appendf
6370: 28 26 77 69 6b 69 5f 61 64 64 5f 6c 69 6e 6b 73  (&wiki_add_links
6380: 2c 20 22 20 7c 20 25 7a 25 68 3c 2f 61 3e 22 2c  , " | %z%h</a>",
6390: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68  .              h
63a0: 72 65 66 28 22 25 52 2f 77 69 6b 69 65 64 69 74  ref("%R/wikiedit
63b0: 3f 6e 61 6d 65 3d 74 61 67 2f 25 68 22 2c 7a 54  ?name=tag/%h",zT
63c0: 61 67 4e 61 6d 65 29 2c 20 7a 54 61 67 4e 61 6d  agName), zTagNam
63d0: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
63e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
63f0: 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 32 29  db_finalize(&q2)
6400: 3b 0a 20 20 20 20 40 20 3c 2f 74 64 3e 3c 2f 74  ;.    @ </td></t
6410: 72 3e 0a 0a 20 20 20 20 40 20 3c 74 72 3e 3c 74  r>..    @ <tr><t
6420: 68 3e 46 69 6c 65 73 3a 3c 2f 74 68 3e 0a 20 20  h>Files:</th>.  
6430: 20 20 40 20 20 20 3c 74 64 3e 0a 20 20 20 20 40    @   <td>.    @
6440: 20 20 20 20 20 25 7a 28 68 72 65 66 28 22 25 52       %z(href("%R
6450: 2f 74 72 65 65 3f 63 69 3d 25 21 53 22 2c 7a 55  /tree?ci=%!S",zU
6460: 75 69 64 29 29 66 69 6c 65 73 3c 2f 61 3e 0a 20  uid))files</a>. 
6470: 20 20 20 40 20 20 20 7c 20 25 7a 28 68 72 65 66     @   | %z(href
6480: 28 22 25 52 2f 66 69 6c 65 61 67 65 3f 6e 61 6d  ("%R/fileage?nam
6490: 65 3d 25 21 53 22 2c 7a 55 75 69 64 29 29 66 69  e=%!S",zUuid))fi
64a0: 6c 65 20 61 67 65 73 3c 2f 61 3e 0a 20 20 20 20  le ages</a>.    
64b0: 40 20 20 20 7c 20 25 7a 28 68 72 65 66 28 22 25  @   | %z(href("%
64c0: 52 2f 74 72 65 65 3f 6e 6f 66 69 6c 65 73 26 74  R/tree?nofiles&t
64d0: 79 70 65 3d 74 72 65 65 26 63 69 3d 25 21 53 22  ype=tree&ci=%!S"
64e0: 2c 7a 55 75 69 64 29 29 66 6f 6c 64 65 72 73 3c  ,zUuid))folders<
64f0: 2f 61 3e 0a 20 20 20 20 40 20 20 20 3c 2f 74 64  /a>.    @   </td
6500: 3e 0a 20 20 20 20 40 20 3c 2f 74 72 3e 0a 0a 20  >.    @ </tr>.. 
6510: 20 20 20 40 20 3c 74 72 3e 3c 74 68 3e 25 73 28     @ <tr><th>%s(
6520: 68 6e 61 6d 65 5f 61 6c 67 28 6e 55 75 69 64 29  hname_alg(nUuid)
6530: 29 3a 3c 2f 74 68 3e 3c 74 64 3e 25 2e 33 32 73  ):</th><td>%.32s
6540: 28 7a 55 75 69 64 29 3c 77 62 72 3e 25 73 28 7a  (zUuid)<wbr>%s(z
6550: 55 75 69 64 2b 33 32 29 0a 20 20 20 20 69 66 28  Uuid+32).    if(
6560: 20 67 2e 70 65 72 6d 2e 53 65 74 75 70 20 29 7b   g.perm.Setup ){
6570: 0a 20 20 20 20 20 20 40 20 28 52 65 63 6f 72 64  .      @ (Record
6580: 20 49 44 3a 20 25 64 28 72 69 64 29 29 0a 20 20   ID: %d(rid)).  
6590: 20 20 7d 0a 20 20 20 20 40 20 3c 2f 74 64 3e 3c    }.    @ </td><
65a0: 2f 74 72 3e 0a 20 20 20 20 40 20 3c 74 72 3e 3c  /tr>.    @ <tr><
65b0: 74 68 3e 55 73 65 72 26 6e 62 73 70 3b 26 61 6d  th>User&nbsp;&am
65c0: 70 3b 26 6e 62 73 70 3b 44 61 74 65 3a 3c 2f 74  p;&nbsp;Date:</t
65d0: 68 3e 3c 74 64 3e 0a 20 20 20 20 68 79 70 65 72  h><td>.    hyper
65e0: 6c 69 6e 6b 5f 74 6f 5f 75 73 65 72 28 7a 55 73  link_to_user(zUs
65f0: 65 72 2c 7a 44 61 74 65 2c 22 20 6f 6e 20 22 29  er,zDate," on ")
6600: 3b 0a 20 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f  ;.    hyperlink_
6610: 74 6f 5f 64 61 74 65 28 7a 44 61 74 65 2c 20 22  to_date(zDate, "
6620: 3c 2f 74 64 3e 3c 2f 74 72 3e 22 29 3b 0a 20 20  </td></tr>");.  
6630: 20 20 69 66 28 20 7a 45 43 6f 6d 6d 65 6e 74 20    if( zEComment 
6640: 29 7b 0a 20 20 20 20 20 20 40 20 3c 74 72 3e 3c  ){.      @ <tr><
6650: 74 68 3e 4f 72 69 67 69 6e 61 6c 26 6e 62 73 70  th>Original&nbsp
6660: 3b 43 6f 6d 6d 65 6e 74 3a 3c 2f 74 68 3e 0a 20  ;Comment:</th>. 
6670: 20 20 20 20 20 40 20 20 20 20 20 3c 74 64 20 63       @     <td c
6680: 6c 61 73 73 3d 22 69 6e 66 6f 43 6f 6d 6d 65 6e  lass="infoCommen
6690: 74 22 3e 25 21 57 28 7a 43 6f 6d 6d 65 6e 74 29  t">%!W(zComment)
66a0: 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 20 20 7d  </td></tr>.    }
66b0: 0a 20 20 20 20 69 66 28 20 66 6f 73 73 69 6c 5f  .    if( fossil_
66c0: 73 74 72 63 6d 70 28 7a 44 61 74 65 2c 20 7a 4f  strcmp(zDate, zO
66d0: 72 69 67 44 61 74 65 29 21 3d 30 0a 20 20 20 20  rigDate)!=0.    
66e0: 20 7c 7c 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d   || fossil_strcm
66f0: 70 28 7a 4f 72 69 67 55 73 65 72 2c 20 7a 55 73  p(zOrigUser, zUs
6700: 65 72 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20  er)!=0.    ){.  
6710: 20 20 20 20 40 20 3c 74 72 3e 3c 74 68 3e 4f 72      @ <tr><th>Or
6720: 69 67 69 6e 61 6c 26 6e 62 73 70 3b 55 73 65 72  iginal&nbsp;User
6730: 26 6e 62 73 70 3b 26 61 6d 70 3b 26 6e 62 73 70  &nbsp;&amp;&nbsp
6740: 3b 44 61 74 65 3a 3c 2f 74 68 3e 3c 74 64 3e 0a  ;Date:</th><td>.
6750: 20 20 20 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f        hyperlink_
6760: 74 6f 5f 75 73 65 72 28 7a 4f 72 69 67 55 73 65  to_user(zOrigUse
6770: 72 2c 7a 4f 72 69 67 44 61 74 65 2c 22 20 6f 6e  r,zOrigDate," on
6780: 20 22 29 3b 0a 20 20 20 20 20 20 68 79 70 65 72   ");.      hyper
6790: 6c 69 6e 6b 5f 74 6f 5f 64 61 74 65 28 7a 4f 72  link_to_date(zOr
67a0: 69 67 44 61 74 65 2c 20 22 3c 2f 74 64 3e 3c 2f  igDate, "</td></
67b0: 74 72 3e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  tr>");.    }.   
67c0: 20 69 66 28 20 67 2e 70 65 72 6d 2e 41 64 6d 69   if( g.perm.Admi
67d0: 6e 20 29 7b 0a 20 20 20 20 20 20 64 62 5f 70 72  n ){.      db_pr
67e0: 65 70 61 72 65 28 26 71 32 2c 0a 20 20 20 20 20  epare(&q2,.     
67f0: 20 20 20 20 22 53 45 4c 45 43 54 20 72 63 76 66      "SELECT rcvf
6800: 72 6f 6d 2e 69 70 61 64 64 72 2c 20 75 73 65 72  rom.ipaddr, user
6810: 2e 6c 6f 67 69 6e 2c 20 64 61 74 65 74 69 6d 65  .login, datetime
6820: 28 72 63 76 66 72 6f 6d 2e 6d 74 69 6d 65 29 22  (rcvfrom.mtime)"
6830: 0a 20 20 20 20 20 20 20 20 20 22 20 20 46 52 4f  .         "  FRO
6840: 4d 20 62 6c 6f 62 20 4a 4f 49 4e 20 72 63 76 66  M blob JOIN rcvf
6850: 72 6f 6d 20 55 53 49 4e 47 28 72 63 76 69 64 29  rom USING(rcvid)
6860: 20 4c 45 46 54 20 4a 4f 49 4e 20 75 73 65 72 20   LEFT JOIN user 
6870: 55 53 49 4e 47 28 75 69 64 29 22 0a 20 20 20 20  USING(uid)".    
6880: 20 20 20 20 20 22 20 57 48 45 52 45 20 62 6c 6f       " WHERE blo
6890: 62 2e 72 69 64 3d 25 64 22 2c 0a 20 20 20 20 20  b.rid=%d",.     
68a0: 20 20 20 20 72 69 64 0a 20 20 20 20 20 20 29 3b      rid.      );
68b0: 0a 20 20 20 20 20 20 69 66 28 20 64 62 5f 73 74  .      if( db_st
68c0: 65 70 28 26 71 32 29 3d 3d 53 51 4c 49 54 45 5f  ep(&q2)==SQLITE_
68d0: 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ROW ){.        c
68e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 70 41 64  onst char *zIpAd
68f0: 64 72 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  dr = db_column_t
6900: 65 78 74 28 26 71 32 2c 20 30 29 3b 0a 20 20 20  ext(&q2, 0);.   
6910: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
6920: 2a 7a 55 73 65 72 20 3d 20 64 62 5f 63 6f 6c 75  *zUser = db_colu
6930: 6d 6e 5f 74 65 78 74 28 26 71 32 2c 20 31 29 3b  mn_text(&q2, 1);
6940: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
6950: 68 61 72 20 2a 7a 44 61 74 65 20 3d 20 64 62 5f  har *zDate = db_
6960: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 32 2c  column_text(&q2,
6970: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   2);.        if(
6980: 20 7a 55 73 65 72 3d 3d 30 20 7c 7c 20 7a 55 73   zUser==0 || zUs
6990: 65 72 5b 30 5d 3d 3d 30 20 29 20 7a 55 73 65 72  er[0]==0 ) zUser
69a0: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20   = "unknown";.  
69b0: 20 20 20 20 20 20 40 20 3c 74 72 3e 3c 74 68 3e        @ <tr><th>
69c0: 52 65 63 65 69 76 65 64 26 6e 62 73 70 3b 46 72  Received&nbsp;Fr
69d0: 6f 6d 3a 3c 2f 74 68 3e 0a 20 20 20 20 20 20 20  om:</th>.       
69e0: 20 40 20 3c 74 64 3e 25 68 28 7a 55 73 65 72 29   @ <td>%h(zUser)
69f0: 20 40 20 25 68 28 7a 49 70 41 64 64 72 29 20 6f   @ %h(zIpAddr) o
6a00: 6e 20 25 73 28 7a 44 61 74 65 29 3c 2f 74 64 3e  n %s(zDate)</td>
6a10: 3c 2f 74 72 3e 0a 20 20 20 20 20 20 7d 0a 20 20  </tr>.      }.  
6a20: 20 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28      db_finalize(
6a30: 26 71 32 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  &q2);.    }..   
6a40: 20 2f 2a 20 4f 6e 6c 79 20 73 68 6f 77 20 6c 69   /* Only show li
6a50: 6e 6b 73 20 74 6f 20 72 65 61 64 20 77 69 6b 69  nks to read wiki
6a60: 20 70 61 67 65 73 20 69 66 20 74 68 65 20 75 73   pages if the us
6a70: 65 72 73 20 63 61 6e 20 72 65 61 64 20 77 69 6b  ers can read wik
6a80: 69 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20  i.    ** and if 
6a90: 74 68 65 20 77 69 6b 69 20 70 61 67 65 73 20 61  the wiki pages a
6aa0: 6c 72 65 61 64 79 20 65 78 69 73 74 20 2a 2f 0a  lready exist */.
6ab0: 20 20 20 20 69 66 28 20 67 2e 70 65 72 6d 2e 52      if( g.perm.R
6ac0: 64 57 69 6b 69 0a 20 20 20 20 20 26 26 20 28 28  dWiki.     && ((
6ad0: 6f 6b 57 69 6b 69 20 3d 20 77 69 6b 69 5f 74 61  okWiki = wiki_ta
6ae0: 67 69 64 32 28 22 63 68 65 63 6b 69 6e 22 2c 7a  gid2("checkin",z
6af0: 55 75 69 64 29 29 21 3d 30 20 7c 7c 0a 20 20 20  Uuid))!=0 ||.   
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c                bl
6b10: 6f 62 5f 73 69 7a 65 28 26 77 69 6b 69 5f 72 65  ob_size(&wiki_re
6b20: 61 64 5f 6c 69 6e 6b 73 29 3e 30 29 0a 20 20 20  ad_links)>0).   
6b30: 20 20 26 26 20 64 62 5f 67 65 74 5f 62 6f 6f 6c    && db_get_bool
6b40: 65 61 6e 28 22 77 69 6b 69 2d 61 62 6f 75 74 22  ean("wiki-about"
6b50: 2c 31 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ,1).    ){.     
6b60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69   const char *zLi
6b70: 6e 6b 73 20 3d 20 62 6c 6f 62 5f 73 74 72 28 26  nks = blob_str(&
6b80: 77 69 6b 69 5f 72 65 61 64 5f 6c 69 6e 6b 73 29  wiki_read_links)
6b90: 3b 0a 20 20 20 20 20 20 40 20 3c 74 72 3e 3c 74  ;.      @ <tr><t
6ba0: 68 3e 57 69 6b 69 3a 3c 2f 74 68 3e 3c 74 64 3e  h>Wiki:</th><td>
6bb0: 5c 0a 20 20 20 20 20 20 69 66 28 20 6f 6b 57 69  \.      if( okWi
6bc0: 6b 69 20 29 7b 0a 20 20 20 20 20 20 20 20 40 20  ki ){.        @ 
6bd0: 25 7a 28 68 72 65 66 28 22 25 52 2f 77 69 6b 69  %z(href("%R/wiki
6be0: 3f 6e 61 6d 65 3d 63 68 65 63 6b 69 6e 2f 25 73  ?name=checkin/%s
6bf0: 22 2c 7a 55 75 69 64 29 29 74 68 69 73 20 63 68  ",zUuid))this ch
6c00: 65 63 6b 69 6e 3c 2f 61 3e 5c 0a 20 20 20 20 20  eckin</a>\.     
6c10: 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c 69 6e 6b   }else if( zLink
6c20: 73 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  s[0] ){.        
6c30: 7a 4c 69 6e 6b 73 20 2b 3d 20 33 3b 0a 20 20 20  zLinks += 3;.   
6c40: 20 20 20 7d 0a 20 20 20 20 20 20 40 20 25 73 28     }.      @ %s(
6c50: 7a 4c 69 6e 6b 73 29 3c 2f 74 64 3e 3c 2f 74 72  zLinks)</td></tr
6c60: 3e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  >.    }..    /* 
6c70: 4f 6e 6c 79 20 73 68 6f 77 20 6c 69 6e 6b 73 20  Only show links 
6c80: 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20 77 69  to create new wi
6c90: 6b 69 20 70 61 67 65 73 20 69 66 20 74 68 65 20  ki pages if the 
6ca0: 75 73 65 72 73 20 63 61 6e 20 77 72 69 74 65 20  users can write 
6cb0: 77 69 6b 69 0a 20 20 20 20 2a 2a 20 61 6e 64 20  wiki.    ** and 
6cc0: 69 66 20 74 68 65 20 77 69 6b 69 20 70 61 67 65  if the wiki page
6cd0: 73 20 64 6f 20 6e 6f 74 20 61 6c 72 65 61 64 79  s do not already
6ce0: 20 65 78 69 73 74 20 2a 2f 0a 20 20 20 20 69 66   exist */.    if
6cf0: 28 20 67 2e 70 65 72 6d 2e 57 72 57 69 6b 69 0a  ( g.perm.WrWiki.
6d00: 20 20 20 20 20 26 26 20 67 2e 70 65 72 6d 2e 52       && g.perm.R
6d10: 64 57 69 6b 69 0a 20 20 20 20 20 26 26 20 67 2e  dWiki.     && g.
6d20: 70 65 72 6d 2e 57 72 69 74 65 0a 20 20 20 20 20  perm.Write.     
6d30: 26 26 20 28 62 6c 6f 62 5f 73 69 7a 65 28 26 77  && (blob_size(&w
6d40: 69 6b 69 5f 61 64 64 5f 6c 69 6e 6b 73 29 3e 30  iki_add_links)>0
6d50: 20 7c 7c 20 21 6f 6b 57 69 6b 69 29 0a 20 20 20   || !okWiki).   
6d60: 20 20 26 26 20 64 62 5f 67 65 74 5f 62 6f 6f 6c    && db_get_bool
6d70: 65 61 6e 28 22 77 69 6b 69 2d 61 62 6f 75 74 22  ean("wiki-about"
6d80: 2c 31 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ,1).    ){.     
6d90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69   const char *zLi
6da0: 6e 6b 73 20 3d 20 62 6c 6f 62 5f 73 74 72 28 26  nks = blob_str(&
6db0: 77 69 6b 69 5f 61 64 64 5f 6c 69 6e 6b 73 29 3b  wiki_add_links);
6dc0: 0a 20 20 20 20 20 20 40 20 3c 74 72 3e 3c 74 68  .      @ <tr><th
6dd0: 3e 41 64 64 26 6e 62 73 70 3b 57 69 6b 69 3a 3c  >Add&nbsp;Wiki:<
6de0: 2f 74 68 3e 3c 74 64 3e 5c 0a 20 20 20 20 20 20  /th><td>\.      
6df0: 69 66 28 20 21 6f 6b 57 69 6b 69 20 29 7b 0a 20  if( !okWiki ){. 
6e00: 20 20 20 20 20 20 20 40 20 25 7a 28 68 72 65 66         @ %z(href
6e10: 28 22 25 52 2f 77 69 6b 69 65 64 69 74 3f 6e 61  ("%R/wikiedit?na
6e20: 6d 65 3d 63 68 65 63 6b 69 6e 2f 25 73 22 2c 7a  me=checkin/%s",z
6e30: 55 75 69 64 29 29 74 68 69 73 20 63 68 65 63 6b  Uuid))this check
6e40: 69 6e 3c 2f 61 3e 5c 0a 20 20 20 20 20 20 7d 65  in</a>\.      }e
6e50: 6c 73 65 20 69 66 28 20 7a 4c 69 6e 6b 73 5b 30  lse if( zLinks[0
6e60: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69  ] ){.        zLi
6e70: 6e 6b 73 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20  nks += 3;.      
6e80: 7d 0a 20 20 20 20 20 20 40 20 25 73 28 7a 4c 69  }.      @ %s(zLi
6e90: 6e 6b 73 29 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20  nks)</td></tr>. 
6ea0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 67 2e     }..    if( g.
6eb0: 70 65 72 6d 2e 48 79 70 65 72 6c 69 6e 6b 20 29  perm.Hyperlink )
6ec0: 7b 0a 20 20 20 20 20 20 40 20 3c 74 72 3e 3c 74  {.      @ <tr><t
6ed0: 68 3e 4f 74 68 65 72 26 6e 62 73 70 3b 4c 69 6e  h>Other&nbsp;Lin
6ee0: 6b 73 3a 3c 2f 74 68 3e 0a 20 20 20 20 20 20 40  ks:</th>.      @
6ef0: 20 20 20 3c 74 64 3e 0a 20 20 20 20 20 20 40 20     <td>.      @ 
6f00: 20 20 25 7a 28 68 72 65 66 28 22 25 52 2f 61 72    %z(href("%R/ar
6f10: 74 69 66 61 63 74 2f 25 21 53 22 2c 7a 55 75 69  tifact/%!S",zUui
6f20: 64 29 29 6d 61 6e 69 66 65 73 74 3c 2f 61 3e 0a  d))manifest</a>.
6f30: 20 20 20 20 20 20 40 20 7c 20 25 7a 28 68 72 65        @ | %z(hre
6f40: 66 28 22 25 52 2f 63 69 5f 74 61 67 73 2f 25 21  f("%R/ci_tags/%!
6f50: 53 22 2c 7a 55 75 69 64 29 29 74 61 67 73 3c 2f  S",zUuid))tags</
6f60: 61 3e 0a 20 20 20 20 20 20 69 66 28 20 67 2e 70  a>.      if( g.p
6f70: 65 72 6d 2e 41 64 6d 69 6e 20 29 7b 0a 20 20 20  erm.Admin ){.   
6f80: 20 20 20 20 20 40 20 20 20 7c 20 25 7a 28 68 72       @   | %z(hr
6f90: 65 66 28 22 25 52 2f 6d 6c 69 6e 6b 3f 63 69 3d  ef("%R/mlink?ci=
6fa0: 25 21 53 22 2c 7a 55 75 69 64 29 29 6d 6c 69 6e  %!S",zUuid))mlin
6fb0: 6b 20 74 61 62 6c 65 3c 2f 61 3e 0a 20 20 20 20  k table</a>.    
6fc0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 67 2e    }.      if( g.
6fd0: 61 6e 6f 6e 2e 57 72 69 74 65 20 29 7b 0a 20 20  anon.Write ){.  
6fe0: 20 20 20 20 20 20 40 20 20 20 7c 20 25 7a 28 68        @   | %z(h
6ff0: 72 65 66 28 22 25 52 2f 63 69 5f 65 64 69 74 3f  ref("%R/ci_edit?
7000: 72 3d 25 21 53 22 2c 7a 55 75 69 64 29 29 65 64  r=%!S",zUuid))ed
7010: 69 74 3c 2f 61 3e 0a 20 20 20 20 20 20 7d 0a 20  it</a>.      }. 
7020: 20 20 20 20 20 40 20 20 20 3c 2f 74 64 3e 0a 20       @   </td>. 
7030: 20 20 20 20 20 40 20 3c 2f 74 72 3e 0a 20 20 20       @ </tr>.   
7040: 20 7d 0a 20 20 20 20 40 20 3c 2f 74 61 62 6c 65   }.    @ </table
7050: 3e 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74  >.    blob_reset
7060: 28 26 77 69 6b 69 5f 72 65 61 64 5f 6c 69 6e 6b  (&wiki_read_link
7070: 73 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73  s);.    blob_res
7080: 65 74 28 26 77 69 6b 69 5f 61 64 64 5f 6c 69 6e  et(&wiki_add_lin
7090: 6b 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ks);.  }else{.  
70a0: 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22    style_header("
70b0: 43 68 65 63 6b 2d 69 6e 20 49 6e 66 6f 72 6d 61  Check-in Informa
70c0: 74 69 6f 6e 22 29 3b 0a 20 20 20 20 6c 6f 67 69  tion");.    logi
70d0: 6e 5f 61 6e 6f 6e 79 6d 6f 75 73 5f 61 76 61 69  n_anonymous_avai
70e0: 6c 61 62 6c 65 28 29 3b 0a 20 20 7d 0a 20 20 64  lable();.  }.  d
70f0: 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 31 29 3b  b_finalize(&q1);
7100: 0a 20 20 69 66 28 20 21 50 42 28 22 6e 6f 77 69  .  if( !PB("nowi
7110: 6b 69 22 29 20 29 7b 0a 20 20 20 20 77 69 6b 69  ki") ){.    wiki
7120: 5f 72 65 6e 64 65 72 5f 61 73 73 6f 63 69 61 74  _render_associat
7130: 65 64 28 22 63 68 65 63 6b 69 6e 22 2c 20 7a 55  ed("checkin", zU
7140: 75 69 64 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  uid, 0);.  }.  r
7150: 65 6e 64 65 72 5f 62 61 63 6b 6c 69 6e 6b 5f 67  ender_backlink_g
7160: 72 61 70 68 28 7a 55 75 69 64 2c 20 22 3c 64 69  raph(zUuid, "<di
7170: 76 20 63 6c 61 73 73 3d 5c 22 73 65 63 74 69 6f  v class=\"sectio
7180: 6e 5c 22 3e 52 65 66 65 72 65 6e 63 65 73 3c 2f  n\">References</
7190: 64 69 76 3e 5c 6e 22 29 3b 0a 20 20 40 20 3c 64  div>\n");.  @ <d
71a0: 69 76 20 63 6c 61 73 73 3d 22 73 65 63 74 69 6f  iv class="sectio
71b0: 6e 22 3e 43 6f 6e 74 65 78 74 3c 2f 64 69 76 3e  n">Context</div>
71c0: 0a 20 20 72 65 6e 64 65 72 5f 63 68 65 63 6b 69  .  render_checki
71d0: 6e 5f 63 6f 6e 74 65 78 74 28 72 69 64 2c 20 30  n_context(rid, 0
71e0: 29 3b 0a 20 20 40 20 3c 64 69 76 20 63 6c 61 73  );.  @ <div clas
71f0: 73 3d 22 73 65 63 74 69 6f 6e 22 3e 43 68 61 6e  s="section">Chan
7200: 67 65 73 3c 2f 64 69 76 3e 0a 20 20 40 20 3c 64  ges</div>.  @ <d
7210: 69 76 20 63 6c 61 73 73 3d 22 73 65 63 74 69 6f  iv class="sectio
7220: 6e 6d 65 6e 75 22 3e 0a 20 20 64 69 66 66 46 6c  nmenu">.  diffFl
7230: 61 67 73 20 3d 20 63 6f 6e 73 74 72 75 63 74 5f  ags = construct_
7240: 64 69 66 66 5f 66 6c 61 67 73 28 64 69 66 66 54  diff_flags(diffT
7250: 79 70 65 29 3b 0a 20 20 7a 57 20 3d 20 28 64 69  ype);.  zW = (di
7260: 66 66 46 6c 61 67 73 26 44 49 46 46 5f 49 47 4e  ffFlags&DIFF_IGN
7270: 4f 52 45 5f 41 4c 4c 57 53 29 3f 22 26 77 22 3a  ORE_ALLWS)?"&w":
7280: 22 22 3b 0a 20 20 69 66 28 20 64 69 66 66 54 79  "";.  if( diffTy
7290: 70 65 21 3d 30 20 29 7b 0a 20 20 20 20 40 20 25  pe!=0 ){.    @ %
72a0: 7a 28 63 68 72 65 66 28 22 62 75 74 74 6f 6e 22  z(chref("button"
72b0: 2c 22 25 52 2f 25 73 2f 25 54 3f 64 69 66 66 3d  ,"%R/%s/%T?diff=
72c0: 30 22 2c 7a 50 61 67 65 48 69 64 65 2c 7a 4e 61  0",zPageHide,zNa
72d0: 6d 65 29 29 5c 0a 20 20 20 20 40 20 48 69 64 65  me))\.    @ Hide
72e0: 26 6e 62 73 70 3b 44 69 66 66 73 3c 2f 61 3e 0a  &nbsp;Diffs</a>.
72f0: 20 20 7d 0a 20 20 69 66 28 20 64 69 66 66 54 79    }.  if( diffTy
7300: 70 65 21 3d 31 20 29 7b 0a 20 20 20 20 40 20 25  pe!=1 ){.    @ %
7310: 7a 28 63 68 72 65 66 28 22 62 75 74 74 6f 6e 22  z(chref("button"
7320: 2c 22 25 52 2f 25 73 2f 25 54 3f 64 69 66 66 3d  ,"%R/%s/%T?diff=
7330: 31 25 73 22 2c 7a 50 61 67 65 2c 7a 4e 61 6d 65  1%s",zPage,zName
7340: 2c 7a 57 29 29 5c 0a 20 20 20 20 40 20 55 6e 69  ,zW))\.    @ Uni
7350: 66 69 65 64 26 6e 62 73 70 3b 44 69 66 66 73 3c  fied&nbsp;Diffs<
7360: 2f 61 3e 0a 20 20 7d 0a 20 20 69 66 28 20 64 69  /a>.  }.  if( di
7370: 66 66 54 79 70 65 21 3d 32 20 29 7b 0a 20 20 20  ffType!=2 ){.   
7380: 20 40 20 25 7a 28 63 68 72 65 66 28 22 62 75 74   @ %z(chref("but
7390: 74 6f 6e 22 2c 22 25 52 2f 25 73 2f 25 54 3f 64  ton","%R/%s/%T?d
73a0: 69 66 66 3d 32 25 73 22 2c 7a 50 61 67 65 2c 7a  iff=2%s",zPage,z
73b0: 4e 61 6d 65 2c 7a 57 29 29 5c 0a 20 20 20 20 40  Name,zW))\.    @
73c0: 20 53 69 64 65 2d 62 79 2d 53 69 64 65 26 6e 62   Side-by-Side&nb
73d0: 73 70 3b 44 69 66 66 73 3c 2f 61 3e 0a 20 20 7d  sp;Diffs</a>.  }
73e0: 0a 20 20 69 66 28 20 64 69 66 66 54 79 70 65 21  .  if( diffType!
73f0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a  =0 ){.    if( *z
7400: 57 20 29 7b 0a 20 20 20 20 20 20 40 20 25 7a 28  W ){.      @ %z(
7410: 63 68 72 65 66 28 22 62 75 74 74 6f 6e 22 2c 22  chref("button","
7420: 25 52 2f 25 73 2f 25 54 22 2c 7a 50 61 67 65 2c  %R/%s/%T",zPage,
7430: 7a 4e 61 6d 65 29 29 0a 20 20 20 20 20 20 40 20  zName)).      @ 
7440: 53 68 6f 77 26 6e 62 73 70 3b 57 68 69 74 65 73  Show&nbsp;Whites
7450: 70 61 63 65 26 6e 62 73 70 3b 43 68 61 6e 67 65  pace&nbsp;Change
7460: 73 3c 2f 61 3e 0a 20 20 20 20 7d 65 6c 73 65 7b  s</a>.    }else{
7470: 0a 20 20 20 20 20 20 40 20 25 7a 28 63 68 72 65  .      @ %z(chre
7480: 66 28 22 62 75 74 74 6f 6e 22 2c 22 25 52 2f 25  f("button","%R/%
7490: 73 2f 25 54 3f 77 22 2c 7a 50 61 67 65 2c 7a 4e  s/%T?w",zPage,zN
74a0: 61 6d 65 29 29 0a 20 20 20 20 20 20 40 20 49 67  ame)).      @ Ig
74b0: 6e 6f 72 65 26 6e 62 73 70 3b 57 68 69 74 65 73  nore&nbsp;Whites
74c0: 70 61 63 65 3c 2f 61 3e 0a 20 20 20 20 7d 0a 20  pace</a>.    }. 
74d0: 20 7d 0a 20 20 69 66 28 20 7a 50 61 72 65 6e 74   }.  if( zParent
74e0: 20 29 7b 0a 20 20 20 20 40 20 25 7a 28 63 68 72   ){.    @ %z(chr
74f0: 65 66 28 22 62 75 74 74 6f 6e 22 2c 22 25 52 2f  ef("button","%R/
7500: 76 70 61 74 63 68 3f 66 72 6f 6d 3d 25 21 53 26  vpatch?from=%!S&
7510: 74 6f 3d 25 21 53 22 2c 7a 50 61 72 65 6e 74 2c  to=%!S",zParent,
7520: 7a 55 75 69 64 29 29 0a 20 20 20 20 40 20 50 61  zUuid)).    @ Pa
7530: 74 63 68 3c 2f 61 3e 0a 20 20 7d 0a 20 20 69 66  tch</a>.  }.  if
7540: 28 20 67 2e 70 65 72 6d 2e 41 64 6d 69 6e 20 29  ( g.perm.Admin )
7550: 7b 0a 20 20 20 20 40 20 25 7a 28 63 68 72 65 66  {.    @ %z(chref
7560: 28 22 62 75 74 74 6f 6e 22 2c 22 25 52 2f 6d 6c  ("button","%R/ml
7570: 69 6e 6b 3f 63 69 3d 25 21 53 22 2c 7a 55 75 69  ink?ci=%!S",zUui
7580: 64 29 29 4d 4c 69 6e 6b 20 54 61 62 6c 65 3c 2f  d))MLink Table</
7590: 61 3e 0a 20 20 7d 0a 20 20 40 3c 2f 64 69 76 3e  a>.  }.  @</div>
75a0: 0a 20 20 69 66 28 20 70 52 65 20 29 7b 0a 20 20  .  if( pRe ){.  
75b0: 20 20 40 20 3c 70 3e 3c 62 3e 4f 6e 6c 79 20 64    @ <p><b>Only d
75c0: 69 66 66 65 72 65 6e 63 65 73 20 74 68 61 74 20  ifferences that 
75d0: 6d 61 74 63 68 20 72 65 67 75 6c 61 72 20 65 78  match regular ex
75e0: 70 72 65 73 73 69 6f 6e 20 22 25 68 28 7a 52 65  pression "%h(zRe
75f0: 29 22 0a 20 20 20 20 40 20 61 72 65 20 73 68 6f  )".    @ are sho
7600: 77 6e 2e 3c 2f 62 3e 3c 2f 70 3e 0a 20 20 7d 0a  wn.</b></p>.  }.
7610: 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 33    db_prepare(&q3
7620: 2c 0a 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61  ,.    "SELECT na
7630: 6d 65 2c 22 0a 20 20 20 20 22 20 20 20 20 20 20  me,".    "      
7640: 20 6d 70 65 72 6d 2c 22 0a 20 20 20 20 22 20 20   mperm,".    "  
7650: 20 20 20 20 20 28 53 45 4c 45 43 54 20 75 75 69       (SELECT uui
7660: 64 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52  d FROM blob WHER
7670: 45 20 72 69 64 3d 6d 6c 69 6e 6b 2e 70 69 64 29  E rid=mlink.pid)
7680: 2c 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 28  ,".    "       (
7690: 53 45 4c 45 43 54 20 75 75 69 64 20 46 52 4f 4d  SELECT uuid FROM
76a0: 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69 64 3d   blob WHERE rid=
76b0: 6d 6c 69 6e 6b 2e 66 69 64 29 2c 22 0a 20 20 20  mlink.fid),".   
76c0: 20 22 20 20 20 20 20 20 20 28 53 45 4c 45 43 54   "       (SELECT
76d0: 20 6e 61 6d 65 20 46 52 4f 4d 20 66 69 6c 65 6e   name FROM filen
76e0: 61 6d 65 20 57 48 45 52 45 20 66 69 6c 65 6e 61  ame WHERE filena
76f0: 6d 65 2e 66 6e 69 64 3d 6d 6c 69 6e 6b 2e 70 66  me.fnid=mlink.pf
7700: 6e 69 64 29 22 0a 20 20 20 20 22 20 20 46 52 4f  nid)".    "  FRO
7710: 4d 20 6d 6c 69 6e 6b 20 4a 4f 49 4e 20 66 69 6c  M mlink JOIN fil
7720: 65 6e 61 6d 65 20 4f 4e 20 66 69 6c 65 6e 61 6d  ename ON filenam
7730: 65 2e 66 6e 69 64 3d 6d 6c 69 6e 6b 2e 66 6e 69  e.fnid=mlink.fni
7740: 64 22 0a 20 20 20 20 22 20 57 48 45 52 45 20 6d  d".    " WHERE m
7750: 6c 69 6e 6b 2e 6d 69 64 3d 25 64 20 41 4e 44 20  link.mid=%d AND 
7760: 4e 4f 54 20 6d 6c 69 6e 6b 2e 69 73 61 75 78 22  NOT mlink.isaux"
7770: 0a 20 20 20 20 22 20 20 20 41 4e 44 20 28 6d 6c  .    "   AND (ml
7780: 69 6e 6b 2e 66 69 64 3e 30 22 0a 20 20 20 20 20  ink.fid>0".     
7790: 20 20 20 20 20 20 22 20 4f 52 20 6d 6c 69 6e 6b        " OR mlink
77a0: 2e 66 6e 69 64 20 4e 4f 54 20 49 4e 20 28 53 45  .fnid NOT IN (SE
77b0: 4c 45 43 54 20 70 66 6e 69 64 20 46 52 4f 4d 20  LECT pfnid FROM 
77c0: 6d 6c 69 6e 6b 20 57 48 45 52 45 20 6d 69 64 3d  mlink WHERE mid=
77d0: 25 64 29 29 22 0a 20 20 20 20 22 20 4f 52 44 45  %d))".    " ORDE
77e0: 52 20 42 59 20 6e 61 6d 65 20 2f 2a 73 6f 72 74  R BY name /*sort
77f0: 2a 2f 22 2c 0a 20 20 20 20 72 69 64 2c 20 72 69  */",.    rid, ri
7800: 64 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  d.  );.  while( 
7810: 64 62 5f 73 74 65 70 28 26 71 33 29 3d 3d 53 51  db_step(&q3)==SQ
7820: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
7830: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
7840: 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65  e = db_column_te
7850: 78 74 28 26 71 33 2c 30 29 3b 0a 20 20 20 20 69  xt(&q3,0);.    i
7860: 6e 74 20 6d 70 65 72 6d 20 3d 20 64 62 5f 63 6f  nt mperm = db_co
7870: 6c 75 6d 6e 5f 69 6e 74 28 26 71 33 2c 20 31 29  lumn_int(&q3, 1)
7880: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
7890: 20 2a 7a 4f 6c 64 20 3d 20 64 62 5f 63 6f 6c 75   *zOld = db_colu
78a0: 6d 6e 5f 74 65 78 74 28 26 71 33 2c 32 29 3b 0a  mn_text(&q3,2);.
78b0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
78c0: 7a 4e 65 77 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  zNew = db_column
78d0: 5f 74 65 78 74 28 26 71 33 2c 33 29 3b 0a 20 20  _text(&q3,3);.  
78e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
78f0: 6c 64 4e 61 6d 65 20 3d 20 64 62 5f 63 6f 6c 75  ldName = db_colu
7900: 6d 6e 5f 74 65 78 74 28 26 71 33 2c 20 34 29 3b  mn_text(&q3, 4);
7910: 0a 20 20 20 20 61 70 70 65 6e 64 5f 66 69 6c 65  .    append_file
7920: 5f 63 68 61 6e 67 65 5f 6c 69 6e 65 28 7a 4e 61  _change_line(zNa
7930: 6d 65 2c 20 7a 4f 6c 64 2c 20 7a 4e 65 77 2c 20  me, zOld, zNew, 
7940: 7a 4f 6c 64 4e 61 6d 65 2c 20 64 69 66 66 46 6c  zOldName, diffFl
7950: 61 67 73 2c 70 52 65 2c 6d 70 65 72 6d 29 3b 0a  ags,pRe,mperm);.
7960: 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a    }.  db_finaliz
7970: 65 28 26 71 33 29 3b 0a 20 20 61 70 70 65 6e 64  e(&q3);.  append
7980: 5f 64 69 66 66 5f 6a 61 76 61 73 63 72 69 70 74  _diff_javascript
7990: 28 64 69 66 66 54 79 70 65 3d 3d 32 29 3b 0a 20  (diffType==2);. 
79a0: 20 63 6f 6f 6b 69 65 5f 72 65 6e 64 65 72 28 29   cookie_render()
79b0: 3b 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72  ;.  style_footer
79c0: 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42  ();.}../*.** WEB
79d0: 50 41 47 45 3a 20 77 69 6e 66 6f 0a 2a 2a 20 55  PAGE: winfo.** U
79e0: 52 4c 3a 20 20 2f 77 69 6e 66 6f 3f 6e 61 6d 65  RL:  /winfo?name
79f0: 3d 55 55 49 44 0a 2a 2a 0a 2a 2a 20 44 69 73 70  =UUID.**.** Disp
7a00: 6c 61 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  lay information 
7a10: 61 62 6f 75 74 20 61 20 77 69 6b 69 20 70 61 67  about a wiki pag
7a20: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 77 69 6e 66 6f  e..*/.void winfo
7a30: 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20 20 69  _page(void){.  i
7a40: 6e 74 20 72 69 64 3b 0a 20 20 4d 61 6e 69 66 65  nt rid;.  Manife
7a50: 73 74 20 2a 70 57 69 6b 69 3b 0a 20 20 63 68 61  st *pWiki;.  cha
7a60: 72 20 2a 7a 55 75 69 64 3b 0a 20 20 63 68 61 72  r *zUuid;.  char
7a70: 20 2a 7a 44 61 74 65 3b 0a 20 20 42 6c 6f 62 20   *zDate;.  Blob 
7a80: 77 69 6b 69 3b 0a 20 20 69 6e 74 20 6d 6f 64 50  wiki;.  int modP
7a90: 65 6e 64 69 6e 67 3b 0a 20 20 63 6f 6e 73 74 20  ending;.  const 
7aa0: 63 68 61 72 20 2a 7a 4d 6f 64 41 63 74 69 6f 6e  char *zModAction
7ab0: 3b 0a 20 20 69 6e 74 20 74 61 67 69 64 3b 0a 20  ;.  int tagid;. 
7ac0: 20 69 6e 74 20 72 69 64 4e 65 78 74 3b 0a 0a 20   int ridNext;.. 
7ad0: 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65   login_check_cre
7ae0: 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66  dentials();.  if
7af0: 28 20 21 67 2e 70 65 72 6d 2e 52 64 57 69 6b 69  ( !g.perm.RdWiki
7b00: 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64   ){ login_needed
7b10: 28 67 2e 61 6e 6f 6e 2e 52 64 57 69 6b 69 29 3b  (g.anon.RdWiki);
7b20: 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 72 69 64   return; }.  rid
7b30: 20 3d 20 6e 61 6d 65 5f 74 6f 5f 72 69 64 5f 77   = name_to_rid_w
7b40: 77 77 28 22 6e 61 6d 65 22 29 3b 0a 20 20 69 66  ww("name");.  if
7b50: 28 20 72 69 64 3d 3d 30 20 7c 7c 20 28 70 57 69  ( rid==0 || (pWi
7b60: 6b 69 20 3d 20 6d 61 6e 69 66 65 73 74 5f 67 65  ki = manifest_ge
7b70: 74 28 72 69 64 2c 20 43 46 54 59 50 45 5f 57 49  t(rid, CFTYPE_WI
7b80: 4b 49 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20  KI, 0))==0 ){.  
7b90: 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22    style_header("
7ba0: 57 69 6b 69 20 50 61 67 65 20 49 6e 66 6f 72 6d  Wiki Page Inform
7bb0: 61 74 69 6f 6e 20 45 72 72 6f 72 22 29 3b 0a 20  ation Error");. 
7bc0: 20 20 20 40 20 4e 6f 20 73 75 63 68 20 6f 62 6a     @ No such obj
7bd0: 65 63 74 3a 20 25 68 28 50 28 22 6e 61 6d 65 22  ect: %h(P("name"
7be0: 29 29 0a 20 20 20 20 73 74 79 6c 65 5f 66 6f 6f  )).    style_foo
7bf0: 74 65 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72  ter();.    retur
7c00: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 2e 70  n;.  }.  if( g.p
7c10: 65 72 6d 2e 4d 6f 64 57 69 6b 69 20 26 26 20 28  erm.ModWiki && (
7c20: 7a 4d 6f 64 41 63 74 69 6f 6e 20 3d 20 50 28 22  zModAction = P("
7c30: 6d 6f 64 61 63 74 69 6f 6e 22 29 29 21 3d 30 20  modaction"))!=0 
7c40: 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
7c50: 70 28 7a 4d 6f 64 41 63 74 69 6f 6e 2c 22 64 65  p(zModAction,"de
7c60: 6c 65 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  lete")==0 ){.   
7c70: 20 20 20 6d 6f 64 65 72 61 74 69 6f 6e 5f 64 69     moderation_di
7c80: 73 61 70 70 72 6f 76 65 28 72 69 64 29 3b 0a 20  sapprove(rid);. 
7c90: 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 2a 2a       /*.      **
7ca0: 20 4e 65 78 74 2c 20 63 68 65 63 6b 20 69 66 20   Next, check if 
7cb0: 74 68 65 20 77 69 6b 69 20 70 61 67 65 20 73 74  the wiki page st
7cc0: 69 6c 6c 20 65 78 69 73 74 73 3b 20 69 66 20 6e  ill exists; if n
7cd0: 6f 74 2c 20 77 65 20 63 61 6e 6e 6f 74 0a 20 20  ot, we cannot.  
7ce0: 20 20 20 20 2a 2a 20 72 65 64 69 72 65 63 74 20      ** redirect 
7cf0: 74 6f 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  to it..      */.
7d00: 20 20 20 20 20 20 69 66 28 20 64 62 5f 65 78 69        if( db_exi
7d10: 73 74 73 28 22 53 45 4c 45 43 54 20 31 20 46 52  sts("SELECT 1 FR
7d20: 4f 4d 20 74 61 67 78 72 65 66 20 4a 4f 49 4e 20  OM tagxref JOIN 
7d30: 74 61 67 20 55 53 49 4e 47 28 74 61 67 69 64 29  tag USING(tagid)
7d40: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
7d50: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 72 69        " WHERE ri
7d60: 64 3d 25 64 20 41 4e 44 20 74 61 67 6e 61 6d 65  d=%d AND tagname
7d70: 20 4c 49 4b 45 20 27 77 69 6b 69 2d 25 25 27 22   LIKE 'wiki-%%'"
7d80: 2c 20 72 69 64 29 20 29 7b 0a 20 20 20 20 20 20  , rid) ){.      
7d90: 20 20 63 67 69 5f 72 65 64 69 72 65 63 74 66 28    cgi_redirectf(
7da0: 22 25 52 2f 77 69 6b 69 3f 6e 61 6d 65 3d 25 54  "%R/wiki?name=%T
7db0: 22 2c 20 70 57 69 6b 69 2d 3e 7a 57 69 6b 69 54  ", pWiki->zWikiT
7dc0: 69 74 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 2f  itle);.        /
7dd0: 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20  *NOTREACHED*/.  
7de0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7df0: 20 20 20 63 67 69 5f 72 65 64 69 72 65 63 74 66     cgi_redirectf
7e00: 28 22 25 52 2f 6d 6f 64 72 65 71 22 29 3b 0a 20  ("%R/modreq");. 
7e10: 20 20 20 20 20 20 20 2f 2a 4e 4f 54 52 45 41 43         /*NOTREAC
7e20: 48 45 44 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  HED*/.      }.  
7e30: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63    }.    if( strc
7e40: 6d 70 28 7a 4d 6f 64 41 63 74 69 6f 6e 2c 22 61  mp(zModAction,"a
7e50: 70 70 72 6f 76 65 22 29 3d 3d 30 20 29 7b 0a 20  pprove")==0 ){. 
7e60: 20 20 20 20 20 6d 6f 64 65 72 61 74 69 6f 6e 5f       moderation_
7e70: 61 70 70 72 6f 76 65 28 72 69 64 29 3b 0a 20 20  approve(rid);.  
7e80: 20 20 7d 0a 20 20 7d 0a 20 20 73 74 79 6c 65 5f    }.  }.  style_
7e90: 68 65 61 64 65 72 28 22 55 70 64 61 74 65 20 6f  header("Update o
7ea0: 66 20 5c 22 25 68 5c 22 22 2c 20 70 57 69 6b 69  f \"%h\"", pWiki
7eb0: 2d 3e 7a 57 69 6b 69 54 69 74 6c 65 29 3b 0a 20  ->zWikiTitle);. 
7ec0: 20 7a 55 75 69 64 20 3d 20 64 62 5f 74 65 78 74   zUuid = db_text
7ed0: 28 30 2c 20 22 53 45 4c 45 43 54 20 75 75 69 64  (0, "SELECT uuid
7ee0: 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45   FROM blob WHERE
7ef0: 20 72 69 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a   rid=%d", rid);.
7f00: 20 20 7a 44 61 74 65 20 3d 20 64 62 5f 74 65 78    zDate = db_tex
7f10: 74 28 30 2c 20 22 53 45 4c 45 43 54 20 64 61 74  t(0, "SELECT dat
7f20: 65 74 69 6d 65 28 25 2e 31 37 67 29 22 2c 20 70  etime(%.17g)", p
7f30: 57 69 6b 69 2d 3e 72 44 61 74 65 29 3b 0a 20 20  Wiki->rDate);.  
7f40: 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c  style_submenu_el
7f50: 65 6d 65 6e 74 28 22 52 61 77 22 2c 20 22 61 72  ement("Raw", "ar
7f60: 74 69 66 61 63 74 2f 25 73 22 2c 20 7a 55 75 69  tifact/%s", zUui
7f70: 64 29 3b 0a 20 20 73 74 79 6c 65 5f 73 75 62 6d  d);.  style_subm
7f80: 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 48 69 73  enu_element("His
7f90: 74 6f 72 79 22 2c 20 22 77 68 69 73 74 6f 72 79  tory", "whistory
7fa0: 3f 6e 61 6d 65 3d 25 74 22 2c 20 70 57 69 6b 69  ?name=%t", pWiki
7fb0: 2d 3e 7a 57 69 6b 69 54 69 74 6c 65 29 3b 0a 20  ->zWikiTitle);. 
7fc0: 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65   style_submenu_e
7fd0: 6c 65 6d 65 6e 74 28 22 50 61 67 65 22 2c 20 22  lement("Page", "
7fe0: 77 69 6b 69 3f 6e 61 6d 65 3d 25 74 22 2c 20 70  wiki?name=%t", p
7ff0: 57 69 6b 69 2d 3e 7a 57 69 6b 69 54 69 74 6c 65  Wiki->zWikiTitle
8000: 29 3b 0a 20 20 6c 6f 67 69 6e 5f 61 6e 6f 6e 79  );.  login_anony
8010: 6d 6f 75 73 5f 61 76 61 69 6c 61 62 6c 65 28 29  mous_available()
8020: 3b 0a 20 20 40 20 3c 64 69 76 20 63 6c 61 73 73  ;.  @ <div class
8030: 3d 22 73 65 63 74 69 6f 6e 22 3e 4f 76 65 72 76  ="section">Overv
8040: 69 65 77 3c 2f 64 69 76 3e 0a 20 20 40 20 3c 70  iew</div>.  @ <p
8050: 3e 3c 74 61 62 6c 65 20 63 6c 61 73 73 3d 22 6c  ><table class="l
8060: 61 62 65 6c 2d 76 61 6c 75 65 22 3e 0a 20 20 40  abel-value">.  @
8070: 20 3c 74 72 3e 3c 74 68 3e 41 72 74 69 66 61 63   <tr><th>Artifac
8080: 74 26 6e 62 73 70 3b 49 44 3a 3c 2f 74 68 3e 0a  t&nbsp;ID:</th>.
8090: 20 20 40 20 3c 74 64 3e 25 7a 28 68 72 65 66 28    @ <td>%z(href(
80a0: 22 25 52 2f 61 72 74 69 66 61 63 74 2f 25 21 53  "%R/artifact/%!S
80b0: 22 2c 7a 55 75 69 64 29 29 25 73 28 7a 55 75 69  ",zUuid))%s(zUui
80c0: 64 29 3c 2f 61 3e 0a 20 20 69 66 28 20 67 2e 70  d)</a>.  if( g.p
80d0: 65 72 6d 2e 53 65 74 75 70 20 29 7b 0a 20 20 20  erm.Setup ){.   
80e0: 20 40 20 28 25 64 28 72 69 64 29 29 0a 20 20 7d   @ (%d(rid)).  }
80f0: 0a 20 20 6d 6f 64 50 65 6e 64 69 6e 67 20 3d 20  .  modPending = 
8100: 6d 6f 64 65 72 61 74 69 6f 6e 5f 70 65 6e 64 69  moderation_pendi
8110: 6e 67 5f 77 77 77 28 72 69 64 29 3b 0a 20 20 40  ng_www(rid);.  @
8120: 20 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 40 20   </td></tr>.  @ 
8130: 3c 74 72 3e 3c 74 68 3e 50 61 67 65 26 6e 62 73  <tr><th>Page&nbs
8140: 70 3b 4e 61 6d 65 3a 3c 2f 74 68 3e 5c 0a 20 20  p;Name:</th>\.  
8150: 40 20 3c 74 64 3e 25 7a 28 68 72 65 66 28 22 25  @ <td>%z(href("%
8160: 52 2f 77 68 69 73 74 6f 72 79 3f 6e 61 6d 65 3d  R/whistory?name=
8170: 25 68 22 2c 70 57 69 6b 69 2d 3e 7a 57 69 6b 69  %h",pWiki->zWiki
8180: 54 69 74 6c 65 29 29 5c 0a 20 20 40 20 25 68 28  Title))\.  @ %h(
8190: 70 57 69 6b 69 2d 3e 7a 57 69 6b 69 54 69 74 6c  pWiki->zWikiTitl
81a0: 65 29 3c 2f 61 3e 3c 2f 74 64 3e 3c 2f 74 72 3e  e)</a></td></tr>
81b0: 0a 20 20 40 20 3c 74 72 3e 3c 74 68 3e 44 61 74  .  @ <tr><th>Dat
81c0: 65 3a 3c 2f 74 68 3e 3c 74 64 3e 0a 20 20 68 79  e:</th><td>.  hy
81d0: 70 65 72 6c 69 6e 6b 5f 74 6f 5f 64 61 74 65 28  perlink_to_date(
81e0: 7a 44 61 74 65 2c 20 22 3c 2f 74 64 3e 3c 2f 74  zDate, "</td></t
81f0: 72 3e 22 29 3b 0a 20 20 40 20 3c 74 72 3e 3c 74  r>");.  @ <tr><t
8200: 68 3e 4f 72 69 67 69 6e 61 6c 26 6e 62 73 70 3b  h>Original&nbsp;
8210: 55 73 65 72 3a 3c 2f 74 68 3e 3c 74 64 3e 0a 20  User:</th><td>. 
8220: 20 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 73   hyperlink_to_us
8230: 65 72 28 70 57 69 6b 69 2d 3e 7a 55 73 65 72 2c  er(pWiki->zUser,
8240: 20 7a 44 61 74 65 2c 20 22 3c 2f 74 64 3e 3c 2f   zDate, "</td></
8250: 74 72 3e 22 29 3b 0a 20 20 69 66 28 20 70 57 69  tr>");.  if( pWi
8260: 6b 69 2d 3e 7a 4d 69 6d 65 74 79 70 65 20 29 7b  ki->zMimetype ){
8270: 0a 20 20 20 20 40 20 3c 74 72 3e 3c 74 68 3e 4d  .    @ <tr><th>M
8280: 69 6d 65 74 79 70 65 3a 3c 2f 74 68 3e 3c 74 64  imetype:</th><td
8290: 3e 25 68 28 70 57 69 6b 69 2d 3e 7a 4d 69 6d 65  >%h(pWiki->zMime
82a0: 74 79 70 65 29 3c 2f 74 64 3e 3c 2f 74 72 3e 0a  type)</td></tr>.
82b0: 20 20 7d 0a 20 20 69 66 28 20 70 57 69 6b 69 2d    }.  if( pWiki-
82c0: 3e 6e 50 61 72 65 6e 74 3e 30 20 29 7b 0a 20 20  >nParent>0 ){.  
82d0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 40 20 3c    int i;.    @ <
82e0: 74 72 3e 3c 74 68 3e 50 61 72 65 6e 74 25 73 28  tr><th>Parent%s(
82f0: 70 57 69 6b 69 2d 3e 6e 50 61 72 65 6e 74 3d 3d  pWiki->nParent==
8300: 31 3f 22 22 3a 22 73 22 29 3a 3c 2f 74 68 3e 3c  1?"":"s"):</th><
8310: 74 64 3e 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  td>.    for(i=0;
8320: 20 69 3c 70 57 69 6b 69 2d 3e 6e 50 61 72 65 6e   i<pWiki->nParen
8330: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  t; i++){.      c
8340: 68 61 72 20 2a 7a 50 61 72 65 6e 74 20 3d 20 70  har *zParent = p
8350: 57 69 6b 69 2d 3e 61 7a 50 61 72 65 6e 74 5b 69  Wiki->azParent[i
8360: 5d 3b 0a 20 20 20 20 20 20 40 20 25 7a 28 68 72  ];.      @ %z(hr
8370: 65 66 28 22 69 6e 66 6f 2f 25 21 53 22 2c 7a 50  ef("info/%!S",zP
8380: 61 72 65 6e 74 29 29 25 73 28 7a 50 61 72 65 6e  arent))%s(zParen
8390: 74 29 3c 2f 61 3e 0a 20 20 20 20 20 20 40 20 25  t)</a>.      @ %
83a0: 7a 28 68 72 65 66 28 22 25 52 2f 77 64 69 66 66  z(href("%R/wdiff
83b0: 3f 69 64 3d 25 21 53 26 70 69 64 3d 25 21 53 22  ?id=%!S&pid=%!S"
83c0: 2c 7a 55 75 69 64 2c 7a 50 61 72 65 6e 74 29 29  ,zUuid,zParent))
83d0: 28 64 69 66 66 29 3c 2f 61 3e 0a 20 20 20 20 7d  (diff)</a>.    }
83e0: 0a 20 20 20 20 40 20 3c 2f 74 64 3e 3c 2f 74 72  .    @ </td></tr
83f0: 3e 0a 20 20 7d 0a 20 20 74 61 67 69 64 20 3d 20  >.  }.  tagid = 
8400: 77 69 6b 69 5f 74 61 67 69 64 28 70 57 69 6b 69  wiki_tagid(pWiki
8410: 2d 3e 7a 57 69 6b 69 54 69 74 6c 65 29 3b 0a 20  ->zWikiTitle);. 
8420: 20 69 66 28 20 74 61 67 69 64 3e 30 20 26 26 20   if( tagid>0 && 
8430: 28 72 69 64 4e 65 78 74 20 3d 20 77 69 6b 69 5f  (ridNext = wiki_
8440: 6e 65 78 74 28 74 61 67 69 64 2c 20 70 57 69 6b  next(tagid, pWik
8450: 69 2d 3e 72 44 61 74 65 29 29 3e 30 20 29 7b 0a  i->rDate))>0 ){.
8460: 20 20 20 20 63 68 61 72 20 2a 7a 49 64 20 3d 20      char *zId = 
8470: 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45  db_text(0, "SELE
8480: 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f  CT uuid FROM blo
8490: 62 20 57 48 45 52 45 20 72 69 64 3d 25 64 22 2c  b WHERE rid=%d",
84a0: 20 72 69 64 4e 65 78 74 29 3b 0a 20 20 20 20 40   ridNext);.    @
84b0: 20 3c 74 72 3e 3c 74 68 3e 4e 65 78 74 3c 2f 74   <tr><th>Next</t
84c0: 68 3e 0a 20 20 20 20 40 20 3c 74 64 3e 25 7a 28  h>.    @ <td>%z(
84d0: 68 72 65 66 28 22 25 52 2f 69 6e 66 6f 2f 25 21  href("%R/info/%!
84e0: 53 22 2c 7a 49 64 29 29 25 73 28 7a 49 64 29 3c  S",zId))%s(zId)<
84f0: 2f 61 3e 3c 2f 74 64 3e 0a 20 20 7d 0a 20 20 40  /a></td>.  }.  @
8500: 20 3c 2f 74 61 62 6c 65 3e 0a 0a 20 20 69 66 28   </table>..  if(
8510: 20 67 2e 70 65 72 6d 2e 4d 6f 64 57 69 6b 69 20   g.perm.ModWiki 
8520: 26 26 20 6d 6f 64 50 65 6e 64 69 6e 67 20 29 7b  && modPending ){
8530: 0a 20 20 20 20 40 20 3c 64 69 76 20 63 6c 61 73  .    @ <div clas
8540: 73 3d 22 73 65 63 74 69 6f 6e 22 3e 4d 6f 64 65  s="section">Mode
8550: 72 61 74 69 6f 6e 3c 2f 64 69 76 3e 0a 20 20 20  ration</div>.   
8560: 20 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a   @ <blockquote>.
8570: 20 20 20 20 40 20 3c 66 6f 72 6d 20 6d 65 74 68      @ <form meth
8580: 6f 64 3d 22 50 4f 53 54 22 20 61 63 74 69 6f 6e  od="POST" action
8590: 3d 22 25 52 2f 77 69 6e 66 6f 2f 25 73 28 7a 55  ="%R/winfo/%s(zU
85a0: 75 69 64 29 22 3e 0a 20 20 20 20 40 20 3c 6c 61  uid)">.    @ <la
85b0: 62 65 6c 3e 3c 69 6e 70 75 74 20 74 79 70 65 3d  bel><input type=
85c0: 22 72 61 64 69 6f 22 20 6e 61 6d 65 3d 22 6d 6f  "radio" name="mo
85d0: 64 61 63 74 69 6f 6e 22 20 76 61 6c 75 65 3d 22  daction" value="
85e0: 64 65 6c 65 74 65 22 3e 0a 20 20 20 20 40 20 44  delete">.    @ D
85f0: 65 6c 65 74 65 20 74 68 69 73 20 63 68 61 6e 67  elete this chang
8600: 65 3c 2f 6c 61 62 65 6c 3e 3c 62 72 20 2f 3e 0a  e</label><br />.
8610: 20 20 20 20 40 20 3c 6c 61 62 65 6c 3e 3c 69 6e      @ <label><in
8620: 70 75 74 20 74 79 70 65 3d 22 72 61 64 69 6f 22  put type="radio"
8630: 20 6e 61 6d 65 3d 22 6d 6f 64 61 63 74 69 6f 6e   name="modaction
8640: 22 20 76 61 6c 75 65 3d 22 61 70 70 72 6f 76 65  " value="approve
8650: 22 3e 0a 20 20 20 20 40 20 41 70 70 72 6f 76 65  ">.    @ Approve
8660: 20 74 68 69 73 20 63 68 61 6e 67 65 3c 2f 6c 61   this change</la
8670: 62 65 6c 3e 3c 62 72 20 2f 3e 0a 20 20 20 20 40  bel><br />.    @
8680: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75   <input type="su
8690: 62 6d 69 74 22 20 76 61 6c 75 65 3d 22 53 75 62  bmit" value="Sub
86a0: 6d 69 74 22 3e 0a 20 20 20 20 40 20 3c 2f 66 6f  mit">.    @ </fo
86b0: 72 6d 3e 0a 20 20 20 20 40 20 3c 2f 62 6c 6f 63  rm>.    @ </bloc
86c0: 6b 71 75 6f 74 65 3e 0a 20 20 7d 0a 0a 0a 20 20  kquote>.  }...  
86d0: 40 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 73 65  @ <div class="se
86e0: 63 74 69 6f 6e 22 3e 43 6f 6e 74 65 6e 74 3c 2f  ction">Content</
86f0: 64 69 76 3e 0a 20 20 62 6c 6f 62 5f 69 6e 69 74  div>.  blob_init
8700: 28 26 77 69 6b 69 2c 20 70 57 69 6b 69 2d 3e 7a  (&wiki, pWiki->z
8710: 57 69 6b 69 2c 20 2d 31 29 3b 0a 20 20 77 69 6b  Wiki, -1);.  wik
8720: 69 5f 72 65 6e 64 65 72 5f 62 79 5f 6d 69 6d 65  i_render_by_mime
8730: 74 79 70 65 28 26 77 69 6b 69 2c 20 70 57 69 6b  type(&wiki, pWik
8740: 69 2d 3e 7a 4d 69 6d 65 74 79 70 65 29 3b 0a 20  i->zMimetype);. 
8750: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 77 69 6b   blob_reset(&wik
8760: 69 29 3b 0a 20 20 6d 61 6e 69 66 65 73 74 5f 64  i);.  manifest_d
8770: 65 73 74 72 6f 79 28 70 57 69 6b 69 29 3b 0a 20  estroy(pWiki);. 
8780: 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b   style_footer();
8790: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
87a0: 6e 20 63 68 65 63 6b 2d 69 6e 20 62 61 73 65 64  n check-in based
87b0: 20 6f 6e 20 71 75 65 72 79 20 70 61 72 61 6d 65   on query parame
87c0: 74 65 72 20 7a 50 61 72 61 6d 20 61 6e 64 20 70  ter zParam and p
87d0: 61 72 73 65 20 69 74 73 0a 2a 2a 20 6d 61 6e 69  arse its.** mani
87e0: 66 65 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68  fest.  Return th
87f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
8800: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 61  rs..*/.static Ma
8810: 6e 69 66 65 73 74 20 2a 76 64 69 66 66 5f 70 61  nifest *vdiff_pa
8820: 72 73 65 5f 6d 61 6e 69 66 65 73 74 28 63 6f 6e  rse_manifest(con
8830: 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c  st char *zParam,
8840: 20 69 6e 74 20 2a 70 52 69 64 29 7b 0a 20 20 69   int *pRid){.  i
8850: 6e 74 20 72 69 64 3b 0a 0a 20 20 2a 70 52 69 64  nt rid;..  *pRid
8860: 20 3d 20 72 69 64 20 3d 20 6e 61 6d 65 5f 74 6f   = rid = name_to
8870: 5f 72 69 64 5f 77 77 77 28 7a 50 61 72 61 6d 29  _rid_www(zParam)
8880: 3b 0a 20 20 69 66 28 20 72 69 64 3d 3d 30 20 29  ;.  if( rid==0 )
8890: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
88a0: 20 2a 7a 20 3d 20 50 28 7a 50 61 72 61 6d 29 3b   *z = P(zParam);
88b0: 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 7c 7c  .    if( z==0 ||
88c0: 20 7a 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20   z[0]==0 ){.    
88d0: 20 20 77 65 62 70 61 67 65 5f 65 72 72 6f 72 28    webpage_error(
88e0: 22 4d 69 73 73 69 6e 67 20 5c 22 25 73 5c 22 20  "Missing \"%s\" 
88f0: 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
8900: 22 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20  ", zParam);.    
8910: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 65 62  }else{.      web
8920: 70 61 67 65 5f 65 72 72 6f 72 28 22 4e 6f 20 73  page_error("No s
8930: 75 63 68 20 61 72 74 69 66 61 63 74 3a 20 5c 22  uch artifact: \"
8940: 25 73 5c 22 22 2c 20 7a 29 3b 0a 20 20 20 20 7d  %s\"", z);.    }
8950: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
8960: 20 7d 0a 20 20 69 66 28 20 21 69 73 5f 61 5f 76   }.  if( !is_a_v
8970: 65 72 73 69 6f 6e 28 72 69 64 29 20 29 7b 0a 20  ersion(rid) ){. 
8980: 20 20 20 77 65 62 70 61 67 65 5f 65 72 72 6f 72     webpage_error
8990: 28 22 41 72 74 69 66 61 63 74 20 25 73 20 69 73  ("Artifact %s is
89a0: 20 6e 6f 74 20 61 20 63 68 65 63 6b 2d 69 6e 2e   not a check-in.
89b0: 22 2c 20 50 28 7a 50 61 72 61 6d 29 29 3b 0a 20  ", P(zParam));. 
89c0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
89d0: 0a 20 20 72 65 74 75 72 6e 20 6d 61 6e 69 66 65  .  return manife
89e0: 73 74 5f 67 65 74 28 72 69 64 2c 20 43 46 54 59  st_get(rid, CFTY
89f0: 50 45 5f 4d 41 4e 49 46 45 53 54 2c 20 30 29 3b  PE_MANIFEST, 0);
8a00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  .}../*.** Output
8a10: 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   a description o
8a20: 66 20 61 20 63 68 65 63 6b 2d 69 6e 0a 2a 2f 0a  f a check-in.*/.
8a30: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
8a40: 6b 69 6e 5f 64 65 73 63 72 69 70 74 69 6f 6e 28  kin_description(
8a50: 69 6e 74 20 72 69 64 29 7b 0a 20 20 53 74 6d 74  int rid){.  Stmt
8a60: 20 71 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65   q;.  db_prepare
8a70: 28 26 71 2c 0a 20 20 20 20 22 53 45 4c 45 43 54  (&q,.    "SELECT
8a80: 20 64 61 74 65 74 69 6d 65 28 6d 74 69 6d 65 29   datetime(mtime)
8a90: 2c 20 63 6f 61 6c 65 73 63 65 28 65 75 73 65 72  , coalesce(euser
8aa0: 2c 75 73 65 72 29 2c 22 0a 20 20 20 20 22 20 20  ,user),".    "  
8ab0: 20 20 20 20 20 63 6f 61 6c 65 73 63 65 28 65 63       coalesce(ec
8ac0: 6f 6d 6d 65 6e 74 2c 63 6f 6d 6d 65 6e 74 29 2c  omment,comment),
8ad0: 20 75 75 69 64 2c 22 0a 20 20 20 20 22 20 20 20   uuid,".    "   
8ae0: 20 20 20 28 53 45 4c 45 43 54 20 67 72 6f 75 70     (SELECT group
8af0: 5f 63 6f 6e 63 61 74 28 73 75 62 73 74 72 28 74  _concat(substr(t
8b00: 61 67 6e 61 6d 65 2c 35 29 2c 20 27 2c 20 27 29  agname,5), ', ')
8b10: 20 46 52 4f 4d 20 74 61 67 2c 20 74 61 67 78 72   FROM tag, tagxr
8b20: 65 66 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  ef".    "       
8b30: 20 57 48 45 52 45 20 74 61 67 6e 61 6d 65 20 47   WHERE tagname G
8b40: 4c 4f 42 20 27 73 79 6d 2d 2a 27 20 41 4e 44 20  LOB 'sym-*' AND 
8b50: 74 61 67 2e 74 61 67 69 64 3d 74 61 67 78 72 65  tag.tagid=tagxre
8b60: 66 2e 74 61 67 69 64 22 0a 20 20 20 20 22 20 20  f.tagid".    "  
8b70: 20 20 20 20 20 20 20 20 41 4e 44 20 74 61 67 78          AND tagx
8b80: 72 65 66 2e 72 69 64 3d 62 6c 6f 62 2e 72 69 64  ref.rid=blob.rid
8b90: 20 41 4e 44 20 74 61 67 78 72 65 66 2e 74 61 67   AND tagxref.tag
8ba0: 74 79 70 65 3e 30 29 22 0a 20 20 20 20 22 20 20  type>0)".    "  
8bb0: 46 52 4f 4d 20 65 76 65 6e 74 2c 20 62 6c 6f 62  FROM event, blob
8bc0: 22 0a 20 20 20 20 22 20 57 48 45 52 45 20 65 76  ".    " WHERE ev
8bd0: 65 6e 74 2e 6f 62 6a 69 64 3d 25 64 20 41 4e 44  ent.objid=%d AND
8be0: 20 74 79 70 65 3d 27 63 69 27 22 0a 20 20 20 20   type='ci'".    
8bf0: 22 20 20 20 41 4e 44 20 62 6c 6f 62 2e 72 69 64  "   AND blob.rid
8c00: 3d 25 64 22 2c 0a 20 20 20 20 72 69 64 2c 20 72  =%d",.    rid, r
8c10: 69 64 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28  id.  );.  while(
8c20: 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51   db_step(&q)==SQ
8c30: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
8c40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
8c50: 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65  e = db_column_te
8c60: 78 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 63  xt(&q, 0);.    c
8c70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 65 72  onst char *zUser
8c80: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78   = db_column_tex
8c90: 74 28 26 71 2c 20 31 29 3b 0a 20 20 20 20 63 6f  t(&q, 1);.    co
8ca0: 6e 73 74 20 63 68 61 72 20 2a 7a 55 75 69 64 20  nst char *zUuid 
8cb0: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
8cc0: 28 26 71 2c 20 33 29 3b 0a 20 20 20 20 63 6f 6e  (&q, 3);.    con
8cd0: 73 74 20 63 68 61 72 20 2a 7a 54 61 67 4c 69 73  st char *zTagLis
8ce0: 74 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65  t = db_column_te
8cf0: 78 74 28 26 71 2c 20 34 29 3b 0a 20 20 20 20 42  xt(&q, 4);.    B
8d00: 6c 6f 62 20 63 6f 6d 6d 65 6e 74 3b 0a 20 20 20  lob comment;.   
8d10: 20 69 6e 74 20 77 69 6b 69 46 6c 61 67 73 20 3d   int wikiFlags =
8d20: 20 57 49 4b 49 5f 49 4e 4c 49 4e 45 7c 57 49 4b   WIKI_INLINE|WIK
8d30: 49 5f 4e 4f 42 41 44 4c 49 4e 4b 53 3b 0a 20 20  I_NOBADLINKS;.  
8d40: 20 20 69 66 28 20 64 62 5f 67 65 74 5f 62 6f 6f    if( db_get_boo
8d50: 6c 65 61 6e 28 22 74 69 6d 65 6c 69 6e 65 2d 62  lean("timeline-b
8d60: 6c 6f 63 6b 2d 6d 61 72 6b 75 70 22 2c 20 30 29  lock-markup", 0)
8d70: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 77 69 6b  ==0 ){.      wik
8d80: 69 46 6c 61 67 73 20 7c 3d 20 57 49 4b 49 5f 4e  iFlags |= WIKI_N
8d90: 4f 42 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  OBLOCK;.    }.  
8da0: 20 20 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75    hyperlink_to_u
8db0: 75 69 64 28 7a 55 75 69 64 29 3b 0a 20 20 20 20  uid(zUuid);.    
8dc0: 62 6c 6f 62 5f 7a 65 72 6f 28 26 63 6f 6d 6d 65  blob_zero(&comme
8dd0: 6e 74 29 3b 0a 20 20 20 20 64 62 5f 63 6f 6c 75  nt);.    db_colu
8de0: 6d 6e 5f 62 6c 6f 62 28 26 71 2c 20 32 2c 20 26  mn_blob(&q, 2, &
8df0: 63 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 77 69  comment);.    wi
8e00: 6b 69 5f 63 6f 6e 76 65 72 74 28 26 63 6f 6d 6d  ki_convert(&comm
8e10: 65 6e 74 2c 20 30 2c 20 77 69 6b 69 46 6c 61 67  ent, 0, wikiFlag
8e20: 73 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73  s);.    blob_res
8e30: 65 74 28 26 63 6f 6d 6d 65 6e 74 29 3b 0a 20 20  et(&comment);.  
8e40: 20 20 40 20 28 75 73 65 72 3a 0a 20 20 20 20 68    @ (user:.    h
8e50: 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 73 65 72  yperlink_to_user
8e60: 28 7a 55 73 65 72 2c 7a 44 61 74 65 2c 22 2c 22  (zUser,zDate,","
8e70: 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 61 67 4c  );.    if( zTagL
8e80: 69 73 74 20 26 26 20 7a 54 61 67 4c 69 73 74 5b  ist && zTagList[
8e90: 30 5d 20 26 26 20 67 2e 70 65 72 6d 2e 48 79 70  0] && g.perm.Hyp
8ea0: 65 72 6c 69 6e 6b 20 29 7b 0a 20 20 20 20 20 20  erlink ){.      
8eb0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 63 6f 6e  int i;.      con
8ec0: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 7a 54 61  st char *z = zTa
8ed0: 67 4c 69 73 74 3b 0a 20 20 20 20 20 20 42 6c 6f  gList;.      Blo
8ee0: 62 20 6c 69 6e 6b 73 3b 0a 20 20 20 20 20 20 62  b links;.      b
8ef0: 6c 6f 62 5f 7a 65 72 6f 28 26 6c 69 6e 6b 73 29  lob_zero(&links)
8f00: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a  ;.      while( z
8f10: 20 26 26 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20   && z[0] ){.    
8f20: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69      for(i=0; z[i
8f30: 5d 20 26 26 20 28 7a 5b 69 5d 21 3d 27 2c 27 20  ] && (z[i]!=',' 
8f40: 7c 7c 20 7a 5b 69 2b 31 5d 21 3d 27 20 27 29 3b  || z[i+1]!=' ');
8f50: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   i++){}.        
8f60: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6c 69  blob_appendf(&li
8f70: 6e 6b 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nks,.           
8f80: 20 20 20 22 25 7a 25 23 68 3c 2f 61 3e 25 2e 32     "%z%#h</a>%.2
8f90: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
8fa0: 20 20 68 72 65 66 28 22 25 52 2f 74 69 6d 65 6c    href("%R/timel
8fb0: 69 6e 65 3f 72 3d 25 23 74 26 6e 64 26 63 3d 25  ine?r=%#t&nd&c=%
8fc0: 74 22 2c 69 2c 7a 2c 7a 44 61 74 65 29 2c 20 69  t",i,z,zDate), i
8fd0: 2c 7a 2c 20 26 7a 5b 69 5d 0a 20 20 20 20 20 20  ,z, &z[i].      
8fe0: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
8ff0: 20 7a 5b 69 5d 3d 3d 30 20 29 20 62 72 65 61 6b   z[i]==0 ) break
9000: 3b 0a 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 69  ;.        z += i
9010: 2b 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +2;.      }.    
9020: 20 20 40 20 74 61 67 73 3a 20 25 73 28 62 6c 6f    @ tags: %s(blo
9030: 62 5f 73 74 72 28 26 6c 69 6e 6b 73 29 29 2c 0a  b_str(&links)),.
9040: 20 20 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74        blob_reset
9050: 28 26 6c 69 6e 6b 73 29 3b 0a 20 20 20 20 7d 65  (&links);.    }e
9060: 6c 73 65 7b 0a 20 20 20 20 20 20 40 20 74 61 67  lse{.      @ tag
9070: 73 3a 20 25 68 28 7a 54 61 67 4c 69 73 74 29 2c  s: %h(zTagList),
9080: 0a 20 20 20 20 7d 0a 20 20 20 20 40 20 64 61 74  .    }.    @ dat
9090: 65 3a 0a 20 20 20 20 68 79 70 65 72 6c 69 6e 6b  e:.    hyperlink
90a0: 5f 74 6f 5f 64 61 74 65 28 7a 44 61 74 65 2c 20  _to_date(zDate, 
90b0: 22 29 22 29 3b 0a 20 20 20 20 74 61 67 5f 70 72  ")");.    tag_pr
90c0: 69 76 61 74 65 5f 73 74 61 74 75 73 28 72 69 64  ivate_status(rid
90d0: 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61  );.  }.  db_fina
90e0: 6c 69 7a 65 28 26 71 29 3b 0a 7d 0a 0a 0a 2f 2a  lize(&q);.}.../*
90f0: 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 76 64 69  .** WEBPAGE: vdi
9100: 66 66 0a 2a 2a 20 55 52 4c 3a 20 2f 76 64 69 66  ff.** URL: /vdif
9110: 66 3f 66 72 6f 6d 3d 54 41 47 26 74 6f 3d 54 41  f?from=TAG&to=TA
9120: 47 0a 2a 2a 0a 2a 2a 20 53 68 6f 77 20 74 68 65  G.**.** Show the
9130: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
9140: 65 65 6e 20 74 77 6f 20 63 68 65 63 6b 2d 69 6e  een two check-in
9150: 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  s identified by 
9160: 74 68 65 20 66 72 6f 6d 3d 20 61 6e 64 0a 2a 2a  the from= and.**
9170: 20 74 6f 3d 20 71 75 65 72 79 20 70 61 72 61 6d   to= query param
9180: 65 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 51 75 65  eters..**.** Que
9190: 72 79 20 70 61 72 61 6d 65 74 65 72 73 3a 0a 2a  ry parameters:.*
91a0: 2a 0a 2a 2a 20 20 20 66 72 6f 6d 3d 54 41 47 20  *.**   from=TAG 
91b0: 20 20 20 20 20 20 20 4c 65 66 74 20 73 69 64 65         Left side
91c0: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
91d0: 6f 6e 0a 2a 2a 20 20 20 74 6f 3d 54 41 47 20 20  on.**   to=TAG  
91e0: 20 20 20 20 20 20 20 20 52 69 67 68 74 20 73 69          Right si
91f0: 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  de of the compar
9200: 69 73 6f 6e 0a 2a 2a 20 20 20 62 72 61 6e 63 68  ison.**   branch
9210: 3d 54 41 47 20 20 20 20 20 20 53 68 6f 77 20 61  =TAG      Show a
9220: 6c 6c 20 63 68 61 6e 67 65 73 20 6f 6e 20 61 20  ll changes on a 
9230: 70 61 72 74 69 63 75 6c 61 72 20 62 72 61 6e 63  particular branc
9240: 68 0a 2a 2a 20 20 20 64 69 66 66 3d 49 4e 54 45  h.**   diff=INTE
9250: 47 45 52 20 20 20 20 30 3a 20 6e 6f 6e 65 2c 20  GER    0: none, 
9260: 31 3a 20 75 6e 69 66 69 65 64 2c 20 32 3a 20 73  1: unified, 2: s
9270: 69 64 65 2d 62 79 2d 73 69 64 65 0a 2a 2a 20 20  ide-by-side.**  
9280: 20 67 6c 6f 62 3d 53 54 52 49 4e 47 20 20 20 20   glob=STRING    
9290: 20 6f 6e 6c 79 20 64 69 66 66 20 66 69 6c 65 73   only diff files
92a0: 20 6d 61 74 63 68 69 6e 67 20 74 68 69 73 20 67   matching this g
92b0: 6c 6f 62 0a 2a 2a 20 20 20 64 63 3d 4e 20 20 20  lob.**   dc=N   
92c0: 20 20 20 20 20 20 20 20 20 73 68 6f 77 20 4e 20           show N 
92d0: 6c 69 6e 65 73 20 6f 66 20 63 6f 6e 74 65 78 74  lines of context
92e0: 20 61 72 6f 75 6e 64 20 65 61 63 68 20 64 69 66   around each dif
92f0: 66 0a 2a 2a 20 20 20 77 3d 42 4f 4f 4c 45 41 4e  f.**   w=BOOLEAN
9300: 20 20 20 20 20 20 20 69 67 6e 6f 72 65 20 77 68         ignore wh
9310: 69 74 65 73 70 61 63 65 20 77 68 65 6e 20 63 6f  itespace when co
9320: 6d 70 75 74 69 6e 67 20 64 69 66 66 73 0a 2a 2a  mputing diffs.**
9330: 20 20 20 6e 6f 68 64 72 20 20 20 20 20 20 20 20     nohdr        
9340: 20 20 20 6f 6d 69 74 20 74 68 65 20 64 65 73 63     omit the desc
9350: 72 69 70 74 69 6f 6e 20 61 74 20 74 68 65 20 74  ription at the t
9360: 6f 70 20 6f 66 20 74 68 65 20 70 61 67 65 0a 2a  op of the page.*
9370: 2a 0a 2a 2a 0a 2a 2a 20 53 68 6f 77 20 61 6c 6c  *.**.** Show all
9380: 20 64 69 66 66 65 72 65 6e 63 65 73 20 62 65 74   differences bet
9390: 77 65 65 6e 20 74 77 6f 20 63 68 65 63 6b 2d 69  ween two check-i
93a0: 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 76 64 69 66  ns..*/.void vdif
93b0: 66 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20 20  f_page(void){.  
93c0: 69 6e 74 20 72 69 64 46 72 6f 6d 2c 20 72 69 64  int ridFrom, rid
93d0: 54 6f 3b 0a 20 20 69 6e 74 20 64 69 66 66 54 79  To;.  int diffTy
93e0: 70 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  pe = 0;        /
93f0: 2a 20 30 3a 20 6e 6f 6e 65 2c 20 31 3a 20 75 6e  * 0: none, 1: un
9400: 69 66 69 65 64 2c 20 32 3a 20 73 69 64 65 2d 62  ified, 2: side-b
9410: 79 2d 73 69 64 65 20 2a 2f 0a 20 20 75 36 34 20  y-side */.  u64 
9420: 64 69 66 66 46 6c 61 67 73 20 3d 20 30 3b 0a 20  diffFlags = 0;. 
9430: 20 4d 61 6e 69 66 65 73 74 20 2a 70 46 72 6f 6d   Manifest *pFrom
9440: 2c 20 2a 70 54 6f 3b 0a 20 20 4d 61 6e 69 66 65  , *pTo;.  Manife
9450: 73 74 46 69 6c 65 20 2a 70 46 69 6c 65 46 72 6f  stFile *pFileFro
9460: 6d 2c 20 2a 70 46 69 6c 65 54 6f 3b 0a 20 20 63  m, *pFileTo;.  c
9470: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 72 61 6e  onst char *zBran
9480: 63 68 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ch;.  const char
9490: 20 2a 7a 46 72 6f 6d 3b 0a 20 20 63 6f 6e 73 74   *zFrom;.  const
94a0: 20 63 68 61 72 20 2a 7a 54 6f 3b 0a 20 20 63 6f   char *zTo;.  co
94b0: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 3b 0a 20  nst char *zRe;. 
94c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 3b   const char *zW;
94d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
94e0: 47 6c 6f 62 3b 0a 20 20 52 65 43 6f 6d 70 69 6c  Glob;.  ReCompil
94f0: 65 64 20 2a 70 52 65 20 3d 20 30 3b 0a 20 20 6c  ed *pRe = 0;.  l
9500: 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65  ogin_check_crede
9510: 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28 20  ntials();.  if( 
9520: 21 67 2e 70 65 72 6d 2e 52 65 61 64 20 29 7b 20  !g.perm.Read ){ 
9530: 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 67 2e 61  login_needed(g.a
9540: 6e 6f 6e 2e 52 65 61 64 29 3b 20 72 65 74 75 72  non.Read); retur
9550: 6e 3b 20 7d 0a 20 20 6c 6f 67 69 6e 5f 61 6e 6f  n; }.  login_ano
9560: 6e 79 6d 6f 75 73 5f 61 76 61 69 6c 61 62 6c 65  nymous_available
9570: 28 29 3b 0a 20 20 63 6f 6f 6b 69 65 5f 6c 69 6e  ();.  cookie_lin
9580: 6b 5f 70 61 72 61 6d 65 74 65 72 28 22 64 69 66  k_parameter("dif
9590: 66 22 2c 22 64 69 66 66 22 2c 22 32 22 29 3b 0a  f","diff","2");.
95a0: 20 20 64 69 66 66 54 79 70 65 20 3d 20 61 74 6f    diffType = ato
95b0: 69 28 50 44 28 22 64 69 66 66 22 2c 22 32 22 29  i(PD("diff","2")
95c0: 29 3b 0a 20 20 63 6f 6f 6b 69 65 5f 72 65 6e 64  );.  cookie_rend
95d0: 65 72 28 29 3b 0a 20 20 7a 52 65 20 3d 20 50 28  er();.  zRe = P(
95e0: 22 72 65 67 65 78 22 29 3b 0a 20 20 69 66 28 20  "regex");.  if( 
95f0: 7a 52 65 20 29 20 72 65 5f 63 6f 6d 70 69 6c 65  zRe ) re_compile
9600: 28 26 70 52 65 2c 20 7a 52 65 2c 20 30 29 3b 0a  (&pRe, zRe, 0);.
9610: 20 20 7a 42 72 61 6e 63 68 20 3d 20 50 28 22 62    zBranch = P("b
9620: 72 61 6e 63 68 22 29 3b 0a 20 20 69 66 28 20 7a  ranch");.  if( z
9630: 42 72 61 6e 63 68 20 26 26 20 7a 42 72 61 6e 63  Branch && zBranc
9640: 68 5b 30 5d 20 29 7b 0a 20 20 20 20 63 67 69 5f  h[0] ){.    cgi_
9650: 72 65 70 6c 61 63 65 5f 70 61 72 61 6d 65 74 65  replace_paramete
9660: 72 28 22 66 72 6f 6d 22 2c 20 6d 70 72 69 6e 74  r("from", mprint
9670: 66 28 22 72 6f 6f 74 3a 25 73 22 2c 20 7a 42 72  f("root:%s", zBr
9680: 61 6e 63 68 29 29 3b 0a 20 20 20 20 63 67 69 5f  anch));.    cgi_
9690: 72 65 70 6c 61 63 65 5f 70 61 72 61 6d 65 74 65  replace_paramete
96a0: 72 28 22 74 6f 22 2c 20 7a 42 72 61 6e 63 68 29  r("to", zBranch)
96b0: 3b 0a 20 20 7d 0a 20 20 70 54 6f 20 3d 20 76 64  ;.  }.  pTo = vd
96c0: 69 66 66 5f 70 61 72 73 65 5f 6d 61 6e 69 66 65  iff_parse_manife
96d0: 73 74 28 22 74 6f 22 2c 20 26 72 69 64 54 6f 29  st("to", &ridTo)
96e0: 3b 0a 20 20 69 66 28 20 70 54 6f 3d 3d 30 20 29  ;.  if( pTo==0 )
96f0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 46 72 6f 6d   return;.  pFrom
9700: 20 3d 20 76 64 69 66 66 5f 70 61 72 73 65 5f 6d   = vdiff_parse_m
9710: 61 6e 69 66 65 73 74 28 22 66 72 6f 6d 22 2c 20  anifest("from", 
9720: 26 72 69 64 46 72 6f 6d 29 3b 0a 20 20 69 66 28  &ridFrom);.  if(
9730: 20 70 46 72 6f 6d 3d 3d 30 20 29 20 72 65 74 75   pFrom==0 ) retu
9740: 72 6e 3b 0a 20 20 7a 47 6c 6f 62 20 3d 20 50 28  rn;.  zGlob = P(
9750: 22 67 6c 6f 62 22 29 3b 0a 20 20 7a 46 72 6f 6d  "glob");.  zFrom
9760: 20 3d 20 50 28 22 66 72 6f 6d 22 29 3b 0a 20 20   = P("from");.  
9770: 7a 54 6f 20 3d 20 50 28 22 74 6f 22 29 3b 0a 20  zTo = P("to");. 
9780: 20 69 66 28 7a 47 6c 6f 62 20 26 26 20 21 2a 7a   if(zGlob && !*z
9790: 47 6c 6f 62 29 7b 0a 20 20 20 20 7a 47 6c 6f 62  Glob){.    zGlob
97a0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 64   = NULL;.  }.  d
97b0: 69 66 66 46 6c 61 67 73 20 3d 20 63 6f 6e 73 74  iffFlags = const
97c0: 72 75 63 74 5f 64 69 66 66 5f 66 6c 61 67 73 28  ruct_diff_flags(
97d0: 64 69 66 66 54 79 70 65 29 3b 0a 20 20 7a 57 20  diffType);.  zW 
97e0: 3d 20 28 64 69 66 66 46 6c 61 67 73 26 44 49 46  = (diffFlags&DIF
97f0: 46 5f 49 47 4e 4f 52 45 5f 41 4c 4c 57 53 29 3f  F_IGNORE_ALLWS)?
9800: 22 26 77 22 3a 22 22 3b 0a 20 20 73 74 79 6c 65  "&w":"";.  style
9810: 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74  _submenu_element
9820: 28 22 50 61 74 68 22 2c 20 22 25 52 2f 74 69 6d  ("Path", "%R/tim
9830: 65 6c 69 6e 65 3f 6d 65 3d 25 54 26 79 6f 75 3d  eline?me=%T&you=
9840: 25 54 22 2c 20 7a 46 72 6f 6d 2c 20 7a 54 6f 29  %T", zFrom, zTo)
9850: 3b 0a 20 20 69 66 28 20 64 69 66 66 54 79 70 65  ;.  if( diffType
9860: 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 79 6c 65  !=0 ){.    style
9870: 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74  _submenu_element
9880: 28 22 48 69 64 65 20 44 69 66 66 22 2c 20 22 25  ("Hide Diff", "%
9890: 52 2f 76 64 69 66 66 3f 66 72 6f 6d 3d 25 54 26  R/vdiff?from=%T&
98a0: 74 6f 3d 25 54 26 64 69 66 66 3d 30 25 73 25 54  to=%T&diff=0%s%T
98b0: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
98d0: 46 72 6f 6d 2c 20 7a 54 6f 2c 0a 20 20 20 20 20  From, zTo,.     
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98f0: 20 20 20 20 20 7a 47 6c 6f 62 20 3f 20 22 26 67       zGlob ? "&g
9900: 6c 6f 62 3d 22 20 3a 20 22 22 2c 20 7a 47 6c 6f  lob=" : "", zGlo
9910: 62 20 3f 20 7a 47 6c 6f 62 20 3a 20 22 22 2c 20  b ? zGlob : "", 
9920: 7a 57 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  zW);.  }.  if( d
9930: 69 66 66 54 79 70 65 21 3d 32 20 29 7b 0a 20 20  iffType!=2 ){.  
9940: 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f    style_submenu_
9950: 65 6c 65 6d 65 6e 74 28 22 53 69 64 65 2d 62 79  element("Side-by
9960: 2d 53 69 64 65 20 44 69 66 66 22 2c 0a 20 20 20  -Side Diff",.   
9970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9980: 20 20 20 20 20 20 20 22 25 52 2f 76 64 69 66 66         "%R/vdiff
9990: 3f 66 72 6f 6d 3d 25 54 26 74 6f 3d 25 54 26 64  ?from=%T&to=%T&d
99a0: 69 66 66 3d 32 25 73 25 54 25 73 22 2c 0a 20 20  iff=2%s%T%s",.  
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99c0: 20 20 20 20 20 20 20 20 7a 46 72 6f 6d 2c 20 7a          zFrom, z
99d0: 54 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  To,.            
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 47                zG
99f0: 6c 6f 62 20 3f 20 22 26 67 6c 6f 62 3d 22 20 3a  lob ? "&glob=" :
9a00: 20 22 22 2c 20 7a 47 6c 6f 62 20 3f 20 7a 47 6c   "", zGlob ? zGl
9a10: 6f 62 20 3a 20 22 22 2c 20 7a 57 29 3b 0a 20 20  ob : "", zW);.  
9a20: 7d 0a 20 20 69 66 28 20 64 69 66 66 54 79 70 65  }.  if( diffType
9a30: 21 3d 31 20 29 20 7b 0a 20 20 20 20 73 74 79 6c  !=1 ) {.    styl
9a40: 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e  e_submenu_elemen
9a50: 74 28 22 55 6e 69 66 69 65 64 20 44 69 66 66 22  t("Unified Diff"
9a60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 22 25 52 2f              "%R/
9a80: 76 64 69 66 66 3f 66 72 6f 6d 3d 25 54 26 74 6f  vdiff?from=%T&to
9a90: 3d 25 54 26 64 69 66 66 3d 31 25 73 25 54 25 73  =%T&diff=1%s%T%s
9aa0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 72               zFr
9ac0: 6f 6d 2c 20 7a 54 6f 2c 0a 20 20 20 20 20 20 20  om, zTo,.       
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ae0: 20 20 20 7a 47 6c 6f 62 20 3f 20 22 26 67 6c 6f     zGlob ? "&glo
9af0: 62 3d 22 20 3a 20 22 22 2c 20 7a 47 6c 6f 62 20  b=" : "", zGlob 
9b00: 3f 20 7a 47 6c 6f 62 20 3a 20 22 22 2c 20 7a 57  ? zGlob : "", zW
9b10: 29 3b 0a 20 20 7d 0a 20 20 73 74 79 6c 65 5f 73  );.  }.  style_s
9b20: 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22  ubmenu_element("
9b30: 49 6e 76 65 72 74 22 2c 0a 20 20 20 20 20 20 20  Invert",.       
9b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b50: 20 22 25 52 2f 76 64 69 66 66 3f 66 72 6f 6d 3d   "%R/vdiff?from=
9b60: 25 54 26 74 6f 3d 25 54 26 25 73 25 54 25 73 22  %T&to=%T&%s%T%s"
9b70: 2c 20 7a 54 6f 2c 20 7a 46 72 6f 6d 2c 0a 20 20  , zTo, zFrom,.  
9b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b90: 20 20 20 20 20 20 7a 47 6c 6f 62 20 3f 20 22 26        zGlob ? "&
9ba0: 67 6c 6f 62 3d 22 20 3a 20 22 22 2c 20 7a 47 6c  glob=" : "", zGl
9bb0: 6f 62 20 3f 20 7a 47 6c 6f 62 20 3a 20 22 22 2c  ob ? zGlob : "",
9bc0: 20 7a 57 29 3b 0a 20 20 69 66 28 20 7a 47 6c 6f   zW);.  if( zGlo
9bd0: 62 20 29 7b 0a 20 20 20 20 73 74 79 6c 65 5f 73  b ){.    style_s
9be0: 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22  ubmenu_element("
9bf0: 43 6c 65 61 72 20 67 6c 6f 62 22 2c 0a 20 20 20  Clear glob",.   
9c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c10: 20 20 20 20 20 20 20 22 25 52 2f 76 64 69 66 66         "%R/vdiff
9c20: 3f 66 72 6f 6d 3d 25 54 26 74 6f 3d 25 54 26 25  ?from=%T&to=%T&%
9c30: 73 22 2c 20 7a 46 72 6f 6d 2c 20 7a 54 6f 2c 20  s", zFrom, zTo, 
9c40: 7a 57 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  zW);.  }else{.  
9c50: 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f    style_submenu_
9c60: 65 6c 65 6d 65 6e 74 28 22 50 61 74 63 68 22 2c  element("Patch",
9c70: 20 22 25 52 2f 76 70 61 74 63 68 3f 66 72 6f 6d   "%R/vpatch?from
9c80: 3d 25 54 26 74 6f 3d 25 54 25 73 22 2c 20 7a 46  =%T&to=%T%s", zF
9c90: 72 6f 6d 2c 20 7a 54 6f 2c 20 7a 57 29 3b 0a 20  rom, zTo, zW);. 
9ca0: 20 7d 0a 20 20 69 66 28 20 64 69 66 66 54 79 70   }.  if( diffTyp
9cb0: 65 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 79 6c  e!=0 ){.    styl
9cc0: 65 5f 73 75 62 6d 65 6e 75 5f 63 68 65 63 6b 62  e_submenu_checkb
9cd0: 6f 78 28 22 77 22 2c 20 22 49 67 6e 6f 72 65 20  ox("w", "Ignore 
9ce0: 57 68 69 74 65 73 70 61 63 65 22 2c 20 30 2c 20  Whitespace", 0, 
9cf0: 30 29 3b 0a 20 20 7d 0a 20 20 73 74 79 6c 65 5f  0);.  }.  style_
9d00: 68 65 61 64 65 72 28 22 43 68 65 63 6b 2d 69 6e  header("Check-in
9d10: 20 44 69 66 66 65 72 65 6e 63 65 73 22 29 3b 0a   Differences");.
9d20: 20 20 69 66 28 20 50 28 22 6e 6f 68 64 72 22 29    if( P("nohdr")
9d30: 3d 3d 30 20 29 7b 0a 20 20 20 20 40 20 3c 68 32  ==0 ){.    @ <h2
9d40: 3e 44 69 66 66 65 72 65 6e 63 65 20 46 72 6f 6d  >Difference From
9d50: 3a 3c 2f 68 32 3e 3c 62 6c 6f 63 6b 71 75 6f 74  :</h2><blockquot
9d60: 65 3e 0a 20 20 20 20 63 68 65 63 6b 69 6e 5f 64  e>.    checkin_d
9d70: 65 73 63 72 69 70 74 69 6f 6e 28 72 69 64 46 72  escription(ridFr
9d80: 6f 6d 29 3b 0a 20 20 20 20 40 20 3c 2f 62 6c 6f  om);.    @ </blo
9d90: 63 6b 71 75 6f 74 65 3e 3c 68 32 3e 54 6f 3a 3c  ckquote><h2>To:<
9da0: 2f 68 32 3e 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e  /h2><blockquote>
9db0: 0a 20 20 20 20 63 68 65 63 6b 69 6e 5f 64 65 73  .    checkin_des
9dc0: 63 72 69 70 74 69 6f 6e 28 72 69 64 54 6f 29 3b  cription(ridTo);
9dd0: 0a 20 20 20 20 40 20 3c 2f 62 6c 6f 63 6b 71 75  .    @ </blockqu
9de0: 6f 74 65 3e 0a 20 20 20 20 69 66 28 20 70 52 65  ote>.    if( pRe
9df0: 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 70 3e 3c   ){.      @ <p><
9e00: 62 3e 4f 6e 6c 79 20 64 69 66 66 65 72 65 6e 63  b>Only differenc
9e10: 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 72 65  es that match re
9e20: 67 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  gular expression
9e30: 20 22 25 68 28 7a 52 65 29 22 0a 20 20 20 20 20   "%h(zRe)".     
9e40: 20 40 20 61 72 65 20 73 68 6f 77 6e 2e 3c 2f 62   @ are shown.</b
9e50: 3e 3c 2f 70 3e 0a 20 20 20 20 7d 0a 20 20 20 20  ></p>.    }.    
9e60: 69 66 28 20 7a 47 6c 6f 62 20 29 7b 0a 20 20 20  if( zGlob ){.   
9e70: 20 20 20 40 20 3c 70 3e 3c 62 3e 4f 6e 6c 79 20     @ <p><b>Only 
9e80: 66 69 6c 65 73 20 6d 61 74 63 68 69 6e 67 20 74  files matching t
9e90: 68 65 20 67 6c 6f 62 20 22 25 68 28 7a 47 6c 6f  he glob "%h(zGlo
9ea0: 62 29 22 20 61 72 65 20 73 68 6f 77 6e 2e 3c 2f  b)" are shown.</
9eb0: 62 3e 3c 2f 70 3e 0a 20 20 20 20 7d 0a 20 20 20  b></p>.    }.   
9ec0: 20 40 3c 68 72 20 2f 3e 3c 70 3e 0a 20 20 7d 0a   @<hr /><p>.  }.
9ed0: 0a 20 20 6d 61 6e 69 66 65 73 74 5f 66 69 6c 65  .  manifest_file
9ee0: 5f 72 65 77 69 6e 64 28 70 46 72 6f 6d 29 3b 0a  _rewind(pFrom);.
9ef0: 20 20 70 46 69 6c 65 46 72 6f 6d 20 3d 20 6d 61    pFileFrom = ma
9f00: 6e 69 66 65 73 74 5f 66 69 6c 65 5f 6e 65 78 74  nifest_file_next
9f10: 28 70 46 72 6f 6d 2c 20 30 29 3b 0a 20 20 6d 61  (pFrom, 0);.  ma
9f20: 6e 69 66 65 73 74 5f 66 69 6c 65 5f 72 65 77 69  nifest_file_rewi
9f30: 6e 64 28 70 54 6f 29 3b 0a 20 20 70 46 69 6c 65  nd(pTo);.  pFile
9f40: 54 6f 20 3d 20 6d 61 6e 69 66 65 73 74 5f 66 69  To = manifest_fi
9f50: 6c 65 5f 6e 65 78 74 28 70 54 6f 2c 20 30 29 3b  le_next(pTo, 0);
9f60: 0a 20 20 77 68 69 6c 65 28 20 70 46 69 6c 65 46  .  while( pFileF
9f70: 72 6f 6d 20 7c 7c 20 70 46 69 6c 65 54 6f 20 29  rom || pFileTo )
9f80: 7b 0a 20 20 20 20 69 6e 74 20 63 6d 70 3b 0a 20  {.    int cmp;. 
9f90: 20 20 20 69 66 28 20 70 46 69 6c 65 46 72 6f 6d     if( pFileFrom
9fa0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6d 70  ==0 ){.      cmp
9fb0: 20 3d 20 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = +1;.    }else
9fc0: 20 69 66 28 20 70 46 69 6c 65 54 6f 3d 3d 30 20   if( pFileTo==0 
9fd0: 29 7b 0a 20 20 20 20 20 20 63 6d 70 20 3d 20 2d  ){.      cmp = -
9fe0: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
9ff0: 20 20 20 20 63 6d 70 20 3d 20 66 6f 73 73 69 6c      cmp = fossil
a000: 5f 73 74 72 63 6d 70 28 70 46 69 6c 65 46 72 6f  _strcmp(pFileFro
a010: 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 54  m->zName, pFileT
a020: 6f 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  o->zName);.    }
a030: 0a 20 20 20 20 69 66 28 20 63 6d 70 3c 30 20 29  .    if( cmp<0 )
a040: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 47 6c  {.      if( !zGl
a050: 6f 62 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74  ob || sqlite3_st
a060: 72 67 6c 6f 62 28 7a 47 6c 6f 62 2c 20 70 46 69  rglob(zGlob, pFi
a070: 6c 65 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29 3d 3d  leFrom->zName)==
a080: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70  0 ){.        app
a090: 65 6e 64 5f 66 69 6c 65 5f 63 68 61 6e 67 65 5f  end_file_change_
a0a0: 6c 69 6e 65 28 70 46 69 6c 65 46 72 6f 6d 2d 3e  line(pFileFrom->
a0b0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
a0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0d0: 20 20 20 20 20 20 20 70 46 69 6c 65 46 72 6f 6d         pFileFrom
a0e0: 2d 3e 7a 55 75 69 64 2c 20 30 2c 20 30 2c 20 64  ->zUuid, 0, 0, d
a0f0: 69 66 66 46 6c 61 67 73 2c 20 70 52 65 2c 20 30  iffFlags, pRe, 0
a100: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a110: 20 70 46 69 6c 65 46 72 6f 6d 20 3d 20 6d 61 6e   pFileFrom = man
a120: 69 66 65 73 74 5f 66 69 6c 65 5f 6e 65 78 74 28  ifest_file_next(
a130: 70 46 72 6f 6d 2c 20 30 29 3b 0a 20 20 20 20 7d  pFrom, 0);.    }
a140: 65 6c 73 65 20 69 66 28 20 63 6d 70 3e 30 20 29  else if( cmp>0 )
a150: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 47 6c  {.      if( !zGl
a160: 6f 62 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74  ob || sqlite3_st
a170: 72 67 6c 6f 62 28 7a 47 6c 6f 62 2c 20 70 46 69  rglob(zGlob, pFi
a180: 6c 65 54 6f 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20  leTo->zName)==0 
a190: 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  ){.        appen
a1a0: 64 5f 66 69 6c 65 5f 63 68 61 6e 67 65 5f 6c 69  d_file_change_li
a1b0: 6e 65 28 70 46 69 6c 65 54 6f 2d 3e 7a 4e 61 6d  ne(pFileTo->zNam
a1c0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
a1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1e0: 20 20 20 30 2c 20 70 46 69 6c 65 54 6f 2d 3e 7a     0, pFileTo->z
a1f0: 55 75 69 64 2c 20 30 2c 20 64 69 66 66 46 6c 61  Uuid, 0, diffFla
a200: 67 73 2c 20 70 52 65 2c 0a 20 20 20 20 20 20 20  gs, pRe,.       
a210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a220: 20 20 20 20 20 20 20 20 20 6d 61 6e 69 66 65 73           manifes
a230: 74 5f 66 69 6c 65 5f 6d 70 65 72 6d 28 70 46 69  t_file_mperm(pFi
a240: 6c 65 54 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a  leTo));.      }.
a250: 20 20 20 20 20 20 70 46 69 6c 65 54 6f 20 3d 20        pFileTo = 
a260: 6d 61 6e 69 66 65 73 74 5f 66 69 6c 65 5f 6e 65  manifest_file_ne
a270: 78 74 28 70 54 6f 2c 20 30 29 3b 0a 20 20 20 20  xt(pTo, 0);.    
a280: 7d 65 6c 73 65 20 69 66 28 20 66 6f 73 73 69 6c  }else if( fossil
a290: 5f 73 74 72 63 6d 70 28 70 46 69 6c 65 46 72 6f  _strcmp(pFileFro
a2a0: 6d 2d 3e 7a 55 75 69 64 2c 20 70 46 69 6c 65 54  m->zUuid, pFileT
a2b0: 6f 2d 3e 7a 55 75 69 64 29 3d 3d 30 20 29 7b 0a  o->zUuid)==0 ){.
a2c0: 20 20 20 20 20 20 70 46 69 6c 65 46 72 6f 6d 20        pFileFrom 
a2d0: 3d 20 6d 61 6e 69 66 65 73 74 5f 66 69 6c 65 5f  = manifest_file_
a2e0: 6e 65 78 74 28 70 46 72 6f 6d 2c 20 30 29 3b 0a  next(pFrom, 0);.
a2f0: 20 20 20 20 20 20 70 46 69 6c 65 54 6f 20 3d 20        pFileTo = 
a300: 6d 61 6e 69 66 65 73 74 5f 66 69 6c 65 5f 6e 65  manifest_file_ne
a310: 78 74 28 70 54 6f 2c 20 30 29 3b 0a 20 20 20 20  xt(pTo, 0);.    
a320: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
a330: 21 7a 47 6c 6f 62 20 7c 7c 20 28 73 71 6c 69 74  !zGlob || (sqlit
a340: 65 33 5f 73 74 72 67 6c 6f 62 28 7a 47 6c 6f 62  e3_strglob(zGlob
a350: 2c 20 70 46 69 6c 65 46 72 6f 6d 2d 3e 7a 4e 61  , pFileFrom->zNa
a360: 6d 65 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  me)==0.         
a370: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
a380: 33 5f 73 74 72 67 6c 6f 62 28 7a 47 6c 6f 62 2c  3_strglob(zGlob,
a390: 20 70 46 69 6c 65 54 6f 2d 3e 7a 4e 61 6d 65 29   pFileTo->zName)
a3a0: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ==0) ){.        
a3b0: 61 70 70 65 6e 64 5f 66 69 6c 65 5f 63 68 61 6e  append_file_chan
a3c0: 67 65 5f 6c 69 6e 65 28 70 46 69 6c 65 46 72 6f  ge_line(pFileFro
a3d0: 6d 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  m->zName,.      
a3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3f0: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 46            pFileF
a400: 72 6f 6d 2d 3e 7a 55 75 69 64 2c 0a 20 20 20 20  rom->zUuid,.    
a410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a420: 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
a430: 65 54 6f 2d 3e 7a 55 75 69 64 2c 20 30 2c 20 64  eTo->zUuid, 0, d
a440: 69 66 66 46 6c 61 67 73 2c 20 70 52 65 2c 0a 20  iffFlags, pRe,. 
a450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
a470: 61 6e 69 66 65 73 74 5f 66 69 6c 65 5f 6d 70 65  anifest_file_mpe
a480: 72 6d 28 70 46 69 6c 65 54 6f 29 29 3b 0a 20 20  rm(pFileTo));.  
a490: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 46 69 6c      }.      pFil
a4a0: 65 46 72 6f 6d 20 3d 20 6d 61 6e 69 66 65 73 74  eFrom = manifest
a4b0: 5f 66 69 6c 65 5f 6e 65 78 74 28 70 46 72 6f 6d  _file_next(pFrom
a4c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  , 0);.      pFil
a4d0: 65 54 6f 20 3d 20 6d 61 6e 69 66 65 73 74 5f 66  eTo = manifest_f
a4e0: 69 6c 65 5f 6e 65 78 74 28 70 54 6f 2c 20 30 29  ile_next(pTo, 0)
a4f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6d 61  ;.    }.  }.  ma
a500: 6e 69 66 65 73 74 5f 64 65 73 74 72 6f 79 28 70  nifest_destroy(p
a510: 46 72 6f 6d 29 3b 0a 20 20 6d 61 6e 69 66 65 73  From);.  manifes
a520: 74 5f 64 65 73 74 72 6f 79 28 70 54 6f 29 3b 0a  t_destroy(pTo);.
a530: 20 20 61 70 70 65 6e 64 5f 64 69 66 66 5f 6a 61    append_diff_ja
a540: 76 61 73 63 72 69 70 74 28 64 69 66 66 54 79 70  vascript(diffTyp
a550: 65 3d 3d 32 29 3b 0a 20 20 73 74 79 6c 65 5f 66  e==2);.  style_f
a560: 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 23 69 66 20  ooter();.}..#if 
a570: 49 4e 54 45 52 46 41 43 45 0a 2f 2a 0a 2a 2a 20  INTERFACE./*.** 
a580: 50 6f 73 73 69 62 6c 65 20 72 65 74 75 72 6e 20  Possible return 
a590: 76 61 6c 75 65 73 20 66 72 6f 6d 20 6f 62 6a 65  values from obje
a5a0: 63 74 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 29  ct_description()
a5b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 42 4a 54  .*/.#define OBJT
a5c0: 59 50 45 5f 43 48 45 43 4b 49 4e 20 20 20 20 30  YPE_CHECKIN    0
a5d0: 78 30 30 30 31 0a 23 64 65 66 69 6e 65 20 4f 42  x0001.#define OB
a5e0: 4a 54 59 50 45 5f 43 4f 4e 54 45 4e 54 20 20 20  JTYPE_CONTENT   
a5f0: 20 30 78 30 30 30 32 0a 23 64 65 66 69 6e 65 20   0x0002.#define 
a600: 4f 42 4a 54 59 50 45 5f 57 49 4b 49 20 20 20 20  OBJTYPE_WIKI    
a610: 20 20 20 30 78 30 30 30 34 0a 23 64 65 66 69 6e     0x0004.#defin
a620: 65 20 4f 42 4a 54 59 50 45 5f 54 49 43 4b 45 54  e OBJTYPE_TICKET
a630: 20 20 20 20 20 30 78 30 30 30 38 0a 23 64 65 66       0x0008.#def
a640: 69 6e 65 20 4f 42 4a 54 59 50 45 5f 41 54 54 41  ine OBJTYPE_ATTA
a650: 43 48 4d 45 4e 54 20 30 78 30 30 31 30 0a 23 64  CHMENT 0x0010.#d
a660: 65 66 69 6e 65 20 4f 42 4a 54 59 50 45 5f 45 56  efine OBJTYPE_EV
a670: 45 4e 54 20 20 20 20 20 20 30 78 30 30 32 30 0a  ENT      0x0020.
a680: 23 64 65 66 69 6e 65 20 4f 42 4a 54 59 50 45 5f  #define OBJTYPE_
a690: 54 41 47 20 20 20 20 20 20 20 20 30 78 30 30 34  TAG        0x004
a6a0: 30 0a 23 64 65 66 69 6e 65 20 4f 42 4a 54 59 50  0.#define OBJTYP
a6b0: 45 5f 53 59 4d 4c 49 4e 4b 20 20 20 20 30 78 30  E_SYMLINK    0x0
a6c0: 30 38 30 0a 23 64 65 66 69 6e 65 20 4f 42 4a 54  080.#define OBJT
a6d0: 59 50 45 5f 45 58 45 20 20 20 20 20 20 20 20 30  YPE_EXE        0
a6e0: 78 30 31 30 30 0a 23 64 65 66 69 6e 65 20 4f 42  x0100.#define OB
a6f0: 4a 54 59 50 45 5f 46 4f 52 55 4d 20 20 20 20 20  JTYPE_FORUM     
a700: 20 30 78 30 32 30 30 0a 0a 2f 2a 0a 2a 2a 20 50   0x0200../*.** P
a710: 6f 73 73 69 62 6c 65 20 66 6c 61 67 73 20 66 6f  ossible flags fo
a720: 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  r the second par
a730: 61 6d 65 74 65 72 20 74 6f 0a 2a 2a 20 6f 62 6a  ameter to.** obj
a740: 65 63 74 5f 64 65 73 63 72 69 70 74 69 6f 6e 28  ect_description(
a750: 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 42 4a  ).*/.#define OBJ
a760: 44 45 53 43 5f 44 45 54 41 49 4c 20 20 20 20 20  DESC_DETAIL     
a770: 20 30 78 30 30 30 31 20 20 20 2f 2a 20 6d 6f 72   0x0001   /* mor
a780: 65 20 64 65 74 61 69 6c 20 2a 2f 0a 23 64 65 66  e detail */.#def
a790: 69 6e 65 20 4f 42 4a 44 45 53 43 5f 42 41 53 45  ine OBJDESC_BASE
a7a0: 20 20 20 20 20 20 20 20 30 78 30 30 30 32 20 20          0x0002  
a7b0: 20 2f 2a 20 53 65 74 20 3c 62 61 73 65 3e 20 75   /* Set <base> u
a7c0: 73 69 6e 67 20 74 68 69 73 20 6f 62 6a 65 63 74  sing this object
a7d0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   */.#endif../*.*
a7e0: 2a 20 57 72 69 74 65 20 61 20 64 65 73 63 72 69  * Write a descri
a7f0: 70 74 69 6f 6e 20 6f 66 20 61 6e 20 6f 62 6a 65  ption of an obje
a800: 63 74 20 74 6f 20 74 68 65 20 77 77 77 20 72 65  ct to the www re
a810: 70 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ply..**.** If th
a820: 65 20 6f 62 6a 65 63 74 20 69 73 20 61 20 66 69  e object is a fi
a830: 6c 65 20 74 68 65 6e 20 6d 65 6e 74 69 6f 6e 3a  le then mention:
a840: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 49 74 27  .**.**     * It'
a850: 73 20 61 72 74 69 66 61 63 74 20 49 44 0a 2a 2a  s artifact ID.**
a860: 20 20 20 20 20 2a 20 41 6c 6c 20 69 74 73 20 66       * All its f
a870: 69 6c 65 6e 61 6d 65 73 0a 2a 2a 20 20 20 20 20  ilenames.**     
a880: 2a 20 54 68 65 20 63 68 65 63 6b 2d 69 6e 20 69  * The check-in i
a890: 74 20 77 61 73 20 70 61 72 74 20 6f 66 2c 20 77  t was part of, w
a8a0: 69 74 68 20 74 69 6d 65 73 20 61 6e 64 20 75 73  ith times and us
a8b0: 65 72 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ers.**.** If the
a8c0: 20 6f 62 6a 65 63 74 20 69 73 20 61 20 6d 61 6e   object is a man
a8d0: 69 66 65 73 74 2c 20 74 68 65 6e 20 6d 65 6e 74  ifest, then ment
a8e0: 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ion:.**.**     *
a8f0: 20 49 74 27 73 20 61 72 74 69 66 61 63 74 20 49   It's artifact I
a900: 44 0a 2a 2a 20 20 20 20 20 2a 20 64 61 74 65 20  D.**     * date 
a910: 6f 66 20 63 68 65 63 6b 2d 69 6e 0a 2a 2a 20 20  of check-in.**  
a920: 20 20 20 2a 20 43 6f 6d 6d 65 6e 74 20 26 20 75     * Comment & u
a930: 73 65 72 0a 2a 2f 0a 69 6e 74 20 6f 62 6a 65 63  ser.*/.int objec
a940: 74 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 0a 20  t_description(. 
a950: 20 69 6e 74 20 72 69 64 2c 20 20 20 20 20 20 20   int rid,       
a960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a970: 20 61 72 74 69 66 61 63 74 20 49 44 20 2a 2f 0a   artifact ID */.
a980: 20 20 75 33 32 20 6f 62 6a 64 65 73 63 46 6c 61    u32 objdescFla
a990: 67 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  gs,        /* Fl
a9a0: 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 64  ags to control d
a9b0: 69 73 70 6c 61 79 20 2a 2f 0a 20 20 42 6c 6f 62  isplay */.  Blob
a9c0: 20 2a 70 44 6f 77 6e 6c 6f 61 64 4e 61 6d 65 20   *pDownloadName 
a9d0: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 77 69 74       /* Fill wit
a9e0: 68 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  h an appropriate
a9f0: 20 64 6f 77 6e 6c 6f 61 64 20 6e 61 6d 65 20 2a   download name *
aa00: 2f 0a 29 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20  /.){.  Stmt q;. 
aa10: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
aa20: 69 6e 74 20 6e 57 69 6b 69 20 3d 20 30 3b 0a 20  int nWiki = 0;. 
aa30: 20 69 6e 74 20 6f 62 6a 54 79 70 65 20 3d 20 30   int objType = 0
aa40: 3b 0a 20 20 63 68 61 72 20 2a 7a 55 75 69 64 20  ;.  char *zUuid 
aa50: 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45  = db_text(0, "SE
aa60: 4c 45 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62  LECT uuid FROM b
aa70: 6c 6f 62 20 57 48 45 52 45 20 72 69 64 3d 25 64  lob WHERE rid=%d
aa80: 22 2c 20 72 69 64 29 3b 0a 20 20 69 6e 74 20 73  ", rid);.  int s
aa90: 68 6f 77 44 65 74 61 69 6c 20 3d 20 28 6f 62 6a  howDetail = (obj
aaa0: 64 65 73 63 46 6c 61 67 73 20 26 20 4f 42 4a 44  descFlags & OBJD
aab0: 45 53 43 5f 44 45 54 41 49 4c 29 21 3d 30 3b 0a  ESC_DETAIL)!=0;.
aac0: 20 20 63 68 61 72 20 2a 70 72 65 76 4e 61 6d 65    char *prevName
aad0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62 4e 65 65   = 0;.  int bNee
aae0: 64 42 61 73 65 20 3d 20 28 6f 62 6a 64 65 73 63  dBase = (objdesc
aaf0: 46 6c 61 67 73 20 26 20 4f 42 4a 44 45 53 43 5f  Flags & OBJDESC_
ab00: 42 41 53 45 29 21 3d 30 3b 0a 0a 20 20 64 62 5f  BASE)!=0;..  db_
ab10: 70 72 65 70 61 72 65 28 26 71 2c 0a 20 20 20 20  prepare(&q,.    
ab20: 22 53 45 4c 45 43 54 20 66 69 6c 65 6e 61 6d 65  "SELECT filename
ab30: 2e 6e 61 6d 65 2c 20 64 61 74 65 74 69 6d 65 28  .name, datetime(
ab40: 65 76 65 6e 74 2e 6d 74 69 6d 65 2c 74 6f 4c 6f  event.mtime,toLo
ab50: 63 61 6c 28 29 29 2c 22 0a 20 20 20 20 22 20 20  cal()),".    "  
ab60: 20 20 20 20 20 63 6f 61 6c 65 73 63 65 28 65 76       coalesce(ev
ab70: 65 6e 74 2e 65 63 6f 6d 6d 65 6e 74 2c 65 76 65  ent.ecomment,eve
ab80: 6e 74 2e 63 6f 6d 6d 65 6e 74 29 2c 22 0a 20 20  nt.comment),".  
ab90: 20 20 22 20 20 20 20 20 20 20 63 6f 61 6c 65 73    "       coales
aba0: 63 65 28 65 76 65 6e 74 2e 65 75 73 65 72 2c 65  ce(event.euser,e
abb0: 76 65 6e 74 2e 75 73 65 72 29 2c 22 0a 20 20 20  vent.user),".   
abc0: 20 22 20 20 20 20 20 20 20 62 2e 75 75 69 64 2c   "       b.uuid,
abd0: 20 6d 6c 69 6e 6b 2e 6d 70 65 72 6d 2c 22 0a 20   mlink.mperm,". 
abe0: 20 20 20 22 20 20 20 20 20 20 20 63 6f 61 6c 65     "       coale
abf0: 73 63 65 28 28 53 45 4c 45 43 54 20 76 61 6c 75  sce((SELECT valu
ac00: 65 20 46 52 4f 4d 20 74 61 67 78 72 65 66 22 0a  e FROM tagxref".
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac20: 20 20 22 20 20 57 48 45 52 45 20 74 61 67 69 64    "  WHERE tagid
ac30: 3d 25 64 20 41 4e 44 20 74 61 67 74 79 70 65 3e  =%d AND tagtype>
ac40: 30 20 41 4e 44 20 72 69 64 3d 6d 6c 69 6e 6b 2e  0 AND rid=mlink.
ac50: 6d 69 64 29 2c 27 74 72 75 6e 6b 27 29 2c 22 0a  mid),'trunk'),".
ac60: 20 20 20 20 22 20 20 20 20 20 20 20 61 2e 73 69      "       a.si
ac70: 7a 65 22 0a 20 20 20 20 22 20 20 46 52 4f 4d 20  ze".    "  FROM 
ac80: 6d 6c 69 6e 6b 2c 20 66 69 6c 65 6e 61 6d 65 2c  mlink, filename,
ac90: 20 65 76 65 6e 74 2c 20 62 6c 6f 62 20 61 2c 20   event, blob a, 
aca0: 62 6c 6f 62 20 62 22 0a 20 20 20 20 22 20 57 48  blob b".    " WH
acb0: 45 52 45 20 66 69 6c 65 6e 61 6d 65 2e 66 6e 69  ERE filename.fni
acc0: 64 3d 6d 6c 69 6e 6b 2e 66 6e 69 64 22 0a 20 20  d=mlink.fnid".  
acd0: 20 20 22 20 20 20 41 4e 44 20 65 76 65 6e 74 2e    "   AND event.
ace0: 6f 62 6a 69 64 3d 6d 6c 69 6e 6b 2e 6d 69 64 22  objid=mlink.mid"
acf0: 0a 20 20 20 20 22 20 20 20 41 4e 44 20 61 2e 72  .    "   AND a.r
ad00: 69 64 3d 6d 6c 69 6e 6b 2e 66 69 64 22 0a 20 20  id=mlink.fid".  
ad10: 20 20 22 20 20 20 41 4e 44 20 62 2e 72 69 64 3d    "   AND b.rid=
ad20: 6d 6c 69 6e 6b 2e 6d 69 64 22 0a 20 20 20 20 22  mlink.mid".    "
ad30: 20 20 20 41 4e 44 20 6d 6c 69 6e 6b 2e 66 69 64     AND mlink.fid
ad40: 3d 25 64 22 0a 20 20 20 20 22 20 20 20 4f 52 44  =%d".    "   ORD
ad50: 45 52 20 42 59 20 66 69 6c 65 6e 61 6d 65 2e 6e  ER BY filename.n
ad60: 61 6d 65 2c 20 65 76 65 6e 74 2e 6d 74 69 6d 65  ame, event.mtime
ad70: 20 2f 2a 73 6f 72 74 2a 2f 22 2c 0a 20 20 20 20   /*sort*/",.    
ad80: 54 41 47 5f 42 52 41 4e 43 48 2c 20 72 69 64 0a  TAG_BRANCH, rid.
ad90: 20 20 29 3b 0a 20 20 40 20 3c 75 6c 3e 0a 20 20    );.  @ <ul>.  
ada0: 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26  while( db_step(&
adb0: 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  q)==SQLITE_ROW )
adc0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
add0: 20 2a 7a 4e 61 6d 65 20 3d 20 64 62 5f 63 6f 6c   *zName = db_col
ade0: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 30 29 3b  umn_text(&q, 0);
adf0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
ae00: 2a 7a 44 61 74 65 20 3d 20 64 62 5f 63 6f 6c 75  *zDate = db_colu
ae10: 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31 29 3b 0a  mn_text(&q, 1);.
ae20: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
ae30: 7a 43 6f 6d 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  zCom = db_column
ae40: 5f 74 65 78 74 28 26 71 2c 20 32 29 3b 0a 20 20  _text(&q, 2);.  
ae50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
ae60: 73 65 72 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  ser = db_column_
ae70: 74 65 78 74 28 26 71 2c 20 33 29 3b 0a 20 20 20  text(&q, 3);.   
ae80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 65   const char *zVe
ae90: 72 73 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  rs = db_column_t
aea0: 65 78 74 28 26 71 2c 20 34 29 3b 0a 20 20 20 20  ext(&q, 4);.    
aeb0: 69 6e 74 20 6d 50 65 72 6d 20 3d 20 64 62 5f 63  int mPerm = db_c
aec0: 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 35 29  olumn_int(&q, 5)
aed0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
aee0: 20 2a 7a 42 72 20 3d 20 64 62 5f 63 6f 6c 75 6d   *zBr = db_colum
aef0: 6e 5f 74 65 78 74 28 26 71 2c 20 36 29 3b 0a 20  n_text(&q, 6);. 
af00: 20 20 20 69 6e 74 20 73 7a 46 69 6c 65 20 3d 20     int szFile = 
af10: 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71  db_column_int(&q
af20: 2c 37 29 3b 0a 20 20 20 20 69 6e 74 20 73 61 6d  ,7);.    int sam
af30: 65 46 69 6c 65 6e 61 6d 65 20 3d 20 70 72 65 76  eFilename = prev
af40: 4e 61 6d 65 21 3d 30 20 26 26 20 66 6f 73 73 69  Name!=0 && fossi
af50: 6c 5f 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 70  l_strcmp(zName,p
af60: 72 65 76 4e 61 6d 65 29 3d 3d 30 3b 0a 20 20 20  revName)==0;.   
af70: 20 69 66 28 20 73 61 6d 65 46 69 6c 65 6e 61 6d   if( sameFilenam
af80: 65 20 26 26 20 21 73 68 6f 77 44 65 74 61 69 6c  e && !showDetail
af90: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 6e   ){.      if( cn
afa0: 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  t==1 ){.        
afb0: 40 20 25 7a 28 68 72 65 66 28 22 25 52 2f 77 68  @ %z(href("%R/wh
afc0: 61 74 69 73 2f 25 21 53 22 2c 7a 55 75 69 64 29  atis/%!S",zUuid)
afd0: 29 5b 6d 6f 72 65 2e 2e 2e 5d 3c 2f 61 3e 0a 20  )[more...]</a>. 
afe0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6e 74       }.      cnt
aff0: 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ++;.      contin
b000: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
b010: 28 20 21 73 61 6d 65 46 69 6c 65 6e 61 6d 65 20  ( !sameFilename 
b020: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72 65  ){.      if( pre
b030: 76 4e 61 6d 65 20 26 26 20 73 68 6f 77 44 65 74  vName && showDet
b040: 61 69 6c 20 29 20 7b 0a 20 20 20 20 20 20 20 20  ail ) {.        
b050: 40 20 3c 2f 75 6c 3e 0a 20 20 20 20 20 20 7d 0a  @ </ul>.      }.
b060: 20 20 20 20 20 20 69 66 28 20 6d 50 65 72 6d 3d        if( mPerm=
b070: 3d 50 45 52 4d 5f 4c 4e 4b 20 29 7b 0a 20 20 20  =PERM_LNK ){.   
b080: 20 20 20 20 20 40 20 3c 6c 69 3e 53 79 6d 62 6f       @ <li>Symbo
b090: 6c 69 63 20 6c 69 6e 6b 0a 20 20 20 20 20 20 20  lic link.       
b0a0: 20 6f 62 6a 54 79 70 65 20 7c 3d 20 4f 42 4a 54   objType |= OBJT
b0b0: 59 50 45 5f 53 59 4d 4c 49 4e 4b 3b 0a 20 20 20  YPE_SYMLINK;.   
b0c0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 50 65     }else if( mPe
b0d0: 72 6d 3d 3d 50 45 52 4d 5f 45 58 45 20 29 7b 0a  rm==PERM_EXE ){.
b0e0: 20 20 20 20 20 20 20 20 40 20 3c 6c 69 3e 45 78          @ <li>Ex
b0f0: 65 63 75 74 61 62 6c 65 20 66 69 6c 65 0a 20 20  ecutable file.  
b100: 20 20 20 20 20 20 6f 62 6a 54 79 70 65 20 7c 3d        objType |=
b110: 20 4f 42 4a 54 59 50 45 5f 45 58 45 3b 0a 20 20   OBJTYPE_EXE;.  
b120: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b130: 20 20 20 40 20 3c 6c 69 3e 46 69 6c 65 0a 20 20     @ <li>File.  
b140: 20 20 20 20 20 20 69 66 28 20 62 4e 65 65 64 42        if( bNeedB
b150: 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ase ){.         
b160: 20 62 4e 65 65 64 42 61 73 65 20 3d 20 30 3b 0a   bNeedBase = 0;.
b170: 20 20 20 20 20 20 20 20 20 20 73 74 79 6c 65 5f            style_
b180: 73 65 74 5f 63 75 72 72 65 6e 74 5f 70 61 67 65  set_current_page
b190: 28 22 64 6f 63 2f 25 53 2f 25 73 22 2c 7a 56 65  ("doc/%S/%s",zVe
b1a0: 72 73 2c 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  rs,zName);.     
b1b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
b1c0: 20 20 20 6f 62 6a 54 79 70 65 20 7c 3d 20 4f 42     objType |= OB
b1d0: 4a 54 59 50 45 5f 43 4f 4e 54 45 4e 54 3b 0a 20  JTYPE_CONTENT;. 
b1e0: 20 20 20 20 20 40 20 25 7a 28 68 72 65 66 28 22       @ %z(href("
b1f0: 25 52 2f 66 69 6e 66 6f 3f 6e 61 6d 65 3d 25 54  %R/finfo?name=%T
b200: 26 6d 3d 25 21 53 22 2c 7a 4e 61 6d 65 2c 7a 55  &m=%!S",zName,zU
b210: 75 69 64 29 29 25 68 28 7a 4e 61 6d 65 29 3c 2f  uid))%h(zName)</
b220: 61 3e 0a 20 20 20 20 20 20 74 61 67 5f 70 72 69  a>.      tag_pri
b230: 76 61 74 65 5f 73 74 61 74 75 73 28 72 69 64 29  vate_status(rid)
b240: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 68 6f 77  ;.      if( show
b250: 44 65 74 61 69 6c 20 29 7b 0a 20 20 20 20 20 20  Detail ){.      
b260: 20 20 40 20 3c 75 6c 3e 0a 20 20 20 20 20 20 7d    @ <ul>.      }
b270: 0a 20 20 20 20 20 20 70 72 65 76 4e 61 6d 65 20  .      prevName 
b280: 3d 20 66 6f 73 73 69 6c 5f 73 74 72 64 75 70 28  = fossil_strdup(
b290: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
b2a0: 20 20 69 66 28 20 73 68 6f 77 44 65 74 61 69 6c    if( showDetail
b2b0: 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 6c 69 3e   ){.      @ <li>
b2c0: 0a 20 20 20 20 20 20 68 79 70 65 72 6c 69 6e 6b  .      hyperlink
b2d0: 5f 74 6f 5f 64 61 74 65 28 7a 44 61 74 65 2c 22  _to_date(zDate,"
b2e0: 22 29 3b 0a 20 20 20 20 20 20 40 20 26 6d 64 61  ");.      @ &mda
b2f0: 73 68 3b 20 70 61 72 74 20 6f 66 20 63 68 65 63  sh; part of chec
b300: 6b 2d 69 6e 0a 20 20 20 20 20 20 68 79 70 65 72  k-in.      hyper
b310: 6c 69 6e 6b 5f 74 6f 5f 75 75 69 64 28 7a 56 65  link_to_uuid(zVe
b320: 72 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rs);.    }else{.
b330: 20 20 20 20 20 20 40 20 26 6d 64 61 73 68 3b 20        @ &mdash; 
b340: 70 61 72 74 20 6f 66 20 63 68 65 63 6b 2d 69 6e  part of check-in
b350: 0a 20 20 20 20 20 20 68 79 70 65 72 6c 69 6e 6b  .      hyperlink
b360: 5f 74 6f 5f 75 75 69 64 28 7a 56 65 72 73 29 3b  _to_uuid(zVers);
b370: 0a 20 20 20 20 20 20 40 20 61 74 0a 20 20 20 20  .      @ at.    
b380: 20 20 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 64    hyperlink_to_d
b390: 61 74 65 28 7a 44 61 74 65 2c 22 22 29 3b 0a 20  ate(zDate,"");. 
b3a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 42 72     }.    if( zBr
b3b0: 20 26 26 20 7a 42 72 5b 30 5d 20 29 7b 0a 20 20   && zBr[0] ){.  
b3c0: 20 20 20 20 40 20 6f 6e 20 62 72 61 6e 63 68 20      @ on branch 
b3d0: 25 7a 28 68 72 65 66 28 22 25 52 2f 74 69 6d 65  %z(href("%R/time
b3e0: 6c 69 6e 65 3f 72 3d 25 54 22 2c 7a 42 72 29 29  line?r=%T",zBr))
b3f0: 25 68 28 7a 42 72 29 3c 2f 61 3e 0a 20 20 20 20  %h(zBr)</a>.    
b400: 7d 0a 20 20 20 20 40 20 26 6d 64 61 73 68 3b 20  }.    @ &mdash; 
b410: 25 21 57 28 7a 43 6f 6d 29 20 28 75 73 65 72 3a  %!W(zCom) (user:
b420: 0a 20 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f 74  .    hyperlink_t
b430: 6f 5f 75 73 65 72 28 7a 55 73 65 72 2c 7a 44 61  o_user(zUser,zDa
b440: 74 65 2c 22 2c 22 29 3b 0a 20 20 20 20 40 20 73  te,",");.    @ s
b450: 69 7a 65 3a 20 25 64 28 73 7a 46 69 6c 65 29 29  ize: %d(szFile))
b460: 0a 20 20 20 20 69 66 28 20 67 2e 70 65 72 6d 2e  .    if( g.perm.
b470: 48 79 70 65 72 6c 69 6e 6b 20 29 7b 0a 20 20 20  Hyperlink ){.   
b480: 20 20 20 40 20 25 7a 28 68 72 65 66 28 22 25 52     @ %z(href("%R
b490: 2f 61 6e 6e 6f 74 61 74 65 3f 66 69 6c 65 6e 61  /annotate?filena
b4a0: 6d 65 3d 25 54 26 63 68 65 63 6b 69 6e 3d 25 21  me=%T&checkin=%!
b4b0: 53 22 2c 7a 4e 61 6d 65 2c 7a 56 65 72 73 29 29  S",zName,zVers))
b4c0: 0a 20 20 20 20 20 20 40 20 5b 61 6e 6e 6f 74 61  .      @ [annota
b4d0: 74 65 5d 3c 2f 61 3e 0a 20 20 20 20 20 20 40 20  te]</a>.      @ 
b4e0: 25 7a 28 68 72 65 66 28 22 25 52 2f 62 6c 61 6d  %z(href("%R/blam
b4f0: 65 3f 66 69 6c 65 6e 61 6d 65 3d 25 54 26 63 68  e?filename=%T&ch
b500: 65 63 6b 69 6e 3d 25 21 53 22 2c 7a 4e 61 6d 65  eckin=%!S",zName
b510: 2c 7a 56 65 72 73 29 29 0a 20 20 20 20 20 20 40  ,zVers)).      @
b520: 20 5b 62 6c 61 6d 65 5d 3c 2f 61 3e 0a 20 20 20   [blame]</a>.   
b530: 20 20 20 40 20 25 7a 28 68 72 65 66 28 22 25 52     @ %z(href("%R
b540: 2f 74 69 6d 65 6c 69 6e 65 3f 6e 3d 61 6c 6c 26  /timeline?n=all&
b550: 75 66 3d 25 21 53 22 2c 7a 55 75 69 64 29 29 5b  uf=%!S",zUuid))[
b560: 63 68 65 63 6b 2d 69 6e 73 26 6e 62 73 70 3b 75  check-ins&nbsp;u
b570: 73 69 6e 67 5d 3c 2f 61 3e 0a 20 20 20 20 7d 0a  sing]</a>.    }.
b580: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 69      cnt++;.    i
b590: 66 28 20 70 44 6f 77 6e 6c 6f 61 64 4e 61 6d 65  f( pDownloadName
b5a0: 20 26 26 20 62 6c 6f 62 5f 73 69 7a 65 28 70 44   && blob_size(pD
b5b0: 6f 77 6e 6c 6f 61 64 4e 61 6d 65 29 3d 3d 30 20  ownloadName)==0 
b5c0: 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70  ){.      blob_ap
b5d0: 70 65 6e 64 28 70 44 6f 77 6e 6c 6f 61 64 4e 61  pend(pDownloadNa
b5e0: 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a  me, zName, -1);.
b5f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
b600: 70 72 65 76 4e 61 6d 65 20 26 26 20 73 68 6f 77  prevName && show
b610: 44 65 74 61 69 6c 20 29 7b 0a 20 20 20 20 40 20  Detail ){.    @ 
b620: 3c 2f 75 6c 3e 0a 20 20 7d 0a 20 20 40 20 3c 2f  </ul>.  }.  @ </
b630: 75 6c 3e 0a 20 20 66 72 65 65 28 70 72 65 76 4e  ul>.  free(prevN
b640: 61 6d 65 29 3b 0a 20 20 64 62 5f 66 69 6e 61 6c  ame);.  db_final
b650: 69 7a 65 28 26 71 29 3b 0a 20 20 64 62 5f 70 72  ize(&q);.  db_pr
b660: 65 70 61 72 65 28 26 71 2c 0a 20 20 20 20 22 53  epare(&q,.    "S
b670: 45 4c 45 43 54 20 73 75 62 73 74 72 28 74 61 67  ELECT substr(tag
b680: 6e 61 6d 65 2c 20 36 2c 20 31 30 30 30 30 29 2c  name, 6, 10000),
b690: 20 64 61 74 65 74 69 6d 65 28 65 76 65 6e 74 2e   datetime(event.
b6a0: 6d 74 69 6d 65 2c 20 74 6f 4c 6f 63 61 6c 28 29  mtime, toLocal()
b6b0: 29 2c 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  ),".    "       
b6c0: 63 6f 61 6c 65 73 63 65 28 65 76 65 6e 74 2e 65  coalesce(event.e
b6d0: 75 73 65 72 2c 20 65 76 65 6e 74 2e 75 73 65 72  user, event.user
b6e0: 29 22 0a 20 20 20 20 22 20 20 46 52 4f 4d 20 74  )".    "  FROM t
b6f0: 61 67 78 72 65 66 2c 20 74 61 67 2c 20 65 76 65  agxref, tag, eve
b700: 6e 74 22 0a 20 20 20 20 22 20 57 48 45 52 45 20  nt".    " WHERE 
b710: 74 61 67 78 72 65 66 2e 72 69 64 3d 25 64 22 0a  tagxref.rid=%d".
b720: 20 20 20 20 22 20 20 20 41 4e 44 20 74 61 67 2e      "   AND tag.
b730: 74 61 67 69 64 3d 74 61 67 78 72 65 66 2e 74 61  tagid=tagxref.ta
b740: 67 69 64 22 0a 20 20 20 20 22 20 20 20 41 4e 44  gid".    "   AND
b750: 20 74 61 67 2e 74 61 67 6e 61 6d 65 20 4c 49 4b   tag.tagname LIK
b760: 45 20 27 77 69 6b 69 2d 25 25 27 22 0a 20 20 20  E 'wiki-%%'".   
b770: 20 22 20 20 20 41 4e 44 20 65 76 65 6e 74 2e 6f   "   AND event.o
b780: 62 6a 69 64 3d 74 61 67 78 72 65 66 2e 72 69 64  bjid=tagxref.rid
b790: 22 2c 0a 20 20 20 20 72 69 64 0a 20 20 29 3b 0a  ",.    rid.  );.
b7a0: 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70    while( db_step
b7b0: 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  (&q)==SQLITE_ROW
b7c0: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
b7d0: 61 72 20 2a 7a 50 61 67 65 6e 61 6d 65 20 3d 20  ar *zPagename = 
b7e0: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
b7f0: 71 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74  q, 0);.    const
b800: 20 63 68 61 72 20 2a 7a 44 61 74 65 20 3d 20 64   char *zDate = d
b810: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
b820: 2c 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  , 1);.    const 
b830: 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 64 62  char *zUser = db
b840: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c  _column_text(&q,
b850: 20 32 29 3b 0a 20 20 20 20 69 66 28 20 63 6e 74   2);.    if( cnt
b860: 3e 30 20 29 7b 0a 20 20 20 20 20 20 40 20 41 6c  >0 ){.      @ Al
b870: 73 6f 20 77 69 6b 69 20 70 61 67 65 0a 20 20 20  so wiki page.   
b880: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 40 20   }else{.      @ 
b890: 57 69 6b 69 20 70 61 67 65 0a 20 20 20 20 7d 0a  Wiki page.    }.
b8a0: 20 20 20 20 6f 62 6a 54 79 70 65 20 7c 3d 20 4f      objType |= O
b8b0: 42 4a 54 59 50 45 5f 57 49 4b 49 3b 0a 20 20 20  BJTYPE_WIKI;.   
b8c0: 20 40 20 5b 25 7a 28 68 72 65 66 28 22 25 52 2f   @ [%z(href("%R/
b8d0: 77 69 6b 69 3f 6e 61 6d 65 3d 25 74 22 2c 7a 50  wiki?name=%t",zP
b8e0: 61 67 65 6e 61 6d 65 29 29 25 68 28 7a 50 61 67  agename))%h(zPag
b8f0: 65 6e 61 6d 65 29 3c 2f 61 3e 5d 20 62 79 0a 20  ename)</a>] by. 
b900: 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f     hyperlink_to_
b910: 75 73 65 72 28 7a 55 73 65 72 2c 7a 44 61 74 65  user(zUser,zDate
b920: 2c 22 20 6f 6e 22 29 3b 0a 20 20 20 20 68 79 70  ," on");.    hyp
b930: 65 72 6c 69 6e 6b 5f 74 6f 5f 64 61 74 65 28 7a  erlink_to_date(z
b940: 44 61 74 65 2c 22 2e 22 29 3b 0a 20 20 20 20 6e  Date,".");.    n
b950: 57 69 6b 69 2b 2b 3b 0a 20 20 20 20 63 6e 74 2b  Wiki++;.    cnt+
b960: 2b 3b 0a 20 20 20 20 69 66 28 20 70 44 6f 77 6e  +;.    if( pDown
b970: 6c 6f 61 64 4e 61 6d 65 20 26 26 20 62 6c 6f 62  loadName && blob
b980: 5f 73 69 7a 65 28 70 44 6f 77 6e 6c 6f 61 64 4e  _size(pDownloadN
b990: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
b9a0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 44   blob_appendf(pD
b9b0: 6f 77 6e 6c 6f 61 64 4e 61 6d 65 2c 20 22 25 73  ownloadName, "%s
b9c0: 2e 74 78 74 22 2c 20 7a 50 61 67 65 6e 61 6d 65  .txt", zPagename
b9d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64  );.    }.  }.  d
b9e0: 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a  b_finalize(&q);.
b9f0: 20 20 69 66 28 20 6e 57 69 6b 69 3d 3d 30 20 29    if( nWiki==0 )
ba00: 7b 0a 20 20 20 20 64 62 5f 70 72 65 70 61 72 65  {.    db_prepare
ba10: 28 26 71 2c 0a 20 20 20 20 20 20 22 53 45 4c 45  (&q,.      "SELE
ba20: 43 54 20 64 61 74 65 74 69 6d 65 28 6d 74 69 6d  CT datetime(mtim
ba30: 65 2c 20 74 6f 4c 6f 63 61 6c 28 29 29 2c 20 75  e, toLocal()), u
ba40: 73 65 72 2c 20 63 6f 6d 6d 65 6e 74 2c 20 74 79  ser, comment, ty
ba50: 70 65 2c 20 75 75 69 64 2c 20 74 61 67 69 64 22  pe, uuid, tagid"
ba60: 0a 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20 65  .      "  FROM e
ba70: 76 65 6e 74 2c 20 62 6c 6f 62 22 0a 20 20 20 20  vent, blob".    
ba80: 20 20 22 20 57 48 45 52 45 20 65 76 65 6e 74 2e    " WHERE event.
ba90: 6f 62 6a 69 64 3d 25 64 22 0a 20 20 20 20 20 20  objid=%d".      
baa0: 22 20 20 20 41 4e 44 20 62 6c 6f 62 2e 72 69 64  "   AND blob.rid
bab0: 3d 25 64 22 2c 0a 20 20 20 20 20 20 72 69 64 2c  =%d",.      rid,
bac0: 20 72 69 64 0a 20 20 20 20 29 3b 0a 20 20 20 20   rid.    );.    
bad0: 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26  while( db_step(&
bae0: 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  q)==SQLITE_ROW )
baf0: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
bb00: 61 72 20 2a 7a 44 61 74 65 20 3d 20 64 62 5f 63  ar *zDate = db_c
bb10: 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 30  olumn_text(&q, 0
bb20: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
bb30: 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 64 62 5f  har *zUser = db_
bb40: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
bb50: 31 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  1);.      const 
bb60: 63 68 61 72 20 2a 7a 43 6f 6d 20 3d 20 64 62 5f  char *zCom = db_
bb70: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
bb80: 32 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  2);.      const 
bb90: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 64 62  char *zType = db
bba0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c  _column_text(&q,
bbb0: 20 33 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74   3);.      const
bbc0: 20 63 68 61 72 20 2a 7a 55 75 69 64 20 3d 20 64   char *zUuid = d
bbd0: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
bbe0: 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  , 4);.      int 
bbf0: 65 76 65 6e 74 54 61 67 49 64 20 3d 20 64 62 5f  eventTagId = db_
bc00: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 35  column_int(&q, 5
bc10: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74  );.      if( cnt
bc20: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 40 20  >0 ){.        @ 
bc30: 41 6c 73 6f 0a 20 20 20 20 20 20 7d 0a 20 20 20  Also.      }.   
bc40: 20 20 20 69 66 28 20 7a 54 79 70 65 5b 30 5d 3d     if( zType[0]=
bc50: 3d 27 77 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='w' ){.        
bc60: 40 20 57 69 6b 69 20 65 64 69 74 0a 20 20 20 20  @ Wiki edit.    
bc70: 20 20 20 20 6f 62 6a 54 79 70 65 20 7c 3d 20 4f      objType |= O
bc80: 42 4a 54 59 50 45 5f 57 49 4b 49 3b 0a 20 20 20  BJTYPE_WIKI;.   
bc90: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 79     }else if( zTy
bca0: 70 65 5b 30 5d 3d 3d 27 74 27 20 29 7b 0a 20 20  pe[0]=='t' ){.  
bcb0: 20 20 20 20 20 20 40 20 54 69 63 6b 65 74 20 63        @ Ticket c
bcc0: 68 61 6e 67 65 0a 20 20 20 20 20 20 20 20 6f 62  hange.        ob
bcd0: 6a 54 79 70 65 20 7c 3d 20 4f 42 4a 54 59 50 45  jType |= OBJTYPE
bce0: 5f 54 49 43 4b 45 54 3b 0a 20 20 20 20 20 20 7d  _TICKET;.      }
bcf0: 65 6c 73 65 20 69 66 28 20 7a 54 79 70 65 5b 30  else if( zType[0
bd00: 5d 3d 3d 27 63 27 20 29 7b 0a 20 20 20 20 20 20  ]=='c' ){.      
bd10: 20 20 40 20 4d 61 6e 69 66 65 73 74 20 6f 66 20    @ Manifest of 
bd20: 63 68 65 63 6b 2d 69 6e 0a 20 20 20 20 20 20 20  check-in.       
bd30: 20 6f 62 6a 54 79 70 65 20 7c 3d 20 4f 42 4a 54   objType |= OBJT
bd40: 59 50 45 5f 43 48 45 43 4b 49 4e 3b 0a 20 20 20  YPE_CHECKIN;.   
bd50: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 79     }else if( zTy
bd60: 70 65 5b 30 5d 3d 3d 27 65 27 20 29 7b 0a 20 20  pe[0]=='e' ){.  
bd70: 20 20 20 20 20 20 69 66 28 20 65 76 65 6e 74 54        if( eventT
bd80: 61 67 49 64 20 21 3d 20 30 29 20 7b 0a 20 20 20  agId != 0) {.   
bd90: 20 20 20 20 20 20 20 40 20 49 6e 73 74 61 6e 63         @ Instanc
bda0: 65 20 6f 66 20 74 65 63 68 6e 6f 74 65 0a 20 20  e of technote.  
bdb0: 20 20 20 20 20 20 20 20 6f 62 6a 54 79 70 65 20          objType 
bdc0: 7c 3d 20 4f 42 4a 54 59 50 45 5f 45 56 45 4e 54  |= OBJTYPE_EVENT
bdd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 68 79 70 65  ;.          hype
bde0: 72 6c 69 6e 6b 5f 74 6f 5f 65 76 65 6e 74 5f 74  rlink_to_event_t
bdf0: 61 67 69 64 28 64 62 5f 63 6f 6c 75 6d 6e 5f 69  agid(db_column_i
be00: 6e 74 28 26 71 2c 20 35 29 29 3b 0a 20 20 20 20  nt(&q, 5));.    
be10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
be20: 20 20 20 20 20 40 20 41 74 74 61 63 68 6d 65 6e       @ Attachmen
be30: 74 20 74 6f 20 74 65 63 68 6e 6f 74 65 0a 20 20  t to technote.  
be40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
be50: 6c 73 65 20 69 66 28 20 7a 54 79 70 65 5b 30 5d  lse if( zType[0]
be60: 3d 3d 27 66 27 20 29 7b 0a 20 20 20 20 20 20 20  =='f' ){.       
be70: 20 6f 62 6a 54 79 70 65 20 7c 3d 20 4f 42 4a 54   objType |= OBJT
be80: 59 50 45 5f 46 4f 52 55 4d 3b 0a 20 20 20 20 20  YPE_FORUM;.     
be90: 20 20 20 40 20 46 6f 72 75 6d 20 70 6f 73 74 0a     @ Forum post.
bea0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
beb0: 20 20 20 20 20 40 20 54 61 67 20 72 65 66 65 72       @ Tag refer
bec0: 65 6e 63 69 6e 67 0a 20 20 20 20 20 20 7d 0a 20  encing.      }. 
bed0: 20 20 20 20 20 69 66 28 20 7a 54 79 70 65 5b 30       if( zType[0
bee0: 5d 21 3d 27 65 27 20 7c 7c 20 65 76 65 6e 74 54  ]!='e' || eventT
bef0: 61 67 49 64 20 3d 3d 20 30 29 7b 0a 20 20 20 20  agId == 0){.    
bf00: 20 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f 74 6f      hyperlink_to
bf10: 5f 75 75 69 64 28 7a 55 75 69 64 29 3b 0a 20 20  _uuid(zUuid);.  
bf20: 20 20 20 20 7d 0a 20 20 20 20 20 20 40 20 2d 20      }.      @ - 
bf30: 25 21 57 28 7a 43 6f 6d 29 20 62 79 0a 20 20 20  %!W(zCom) by.   
bf40: 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f     hyperlink_to_
bf50: 75 73 65 72 28 7a 55 73 65 72 2c 7a 44 61 74 65  user(zUser,zDate
bf60: 2c 22 20 6f 6e 22 29 3b 0a 20 20 20 20 20 20 68  ," on");.      h
bf70: 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 64 61 74 65  yperlink_to_date
bf80: 28 7a 44 61 74 65 2c 20 22 2e 22 29 3b 0a 20 20  (zDate, ".");.  
bf90: 20 20 20 20 69 66 28 20 70 44 6f 77 6e 6c 6f 61      if( pDownloa
bfa0: 64 4e 61 6d 65 20 26 26 20 62 6c 6f 62 5f 73 69  dName && blob_si
bfb0: 7a 65 28 70 44 6f 77 6e 6c 6f 61 64 4e 61 6d 65  ze(pDownloadName
bfc0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
bfd0: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 44 6f  blob_appendf(pDo
bfe0: 77 6e 6c 6f 61 64 4e 61 6d 65 2c 20 22 25 53 2e  wnloadName, "%S.
bff0: 74 78 74 22 2c 20 7a 55 75 69 64 29 3b 0a 20 20  txt", zUuid);.  
c000: 20 20 20 20 7d 0a 20 20 20 20 20 20 74 61 67 5f      }.      tag_
c010: 70 72 69 76 61 74 65 5f 73 74 61 74 75 73 28 72  private_status(r
c020: 69 64 29 3b 0a 20 20 20 20 20 20 63 6e 74 2b 2b  id);.      cnt++
c030: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 5f 66  ;.    }.    db_f
c040: 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 7d  inalize(&q);.  }
c050: 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71  .  db_prepare(&q
c060: 2c 0a 20 20 20 20 22 53 45 4c 45 43 54 20 74 61  ,.    "SELECT ta
c070: 72 67 65 74 2c 20 66 69 6c 65 6e 61 6d 65 2c 20  rget, filename, 
c080: 64 61 74 65 74 69 6d 65 28 6d 74 69 6d 65 2c 20  datetime(mtime, 
c090: 74 6f 4c 6f 63 61 6c 28 29 29 2c 20 75 73 65 72  toLocal()), user
c0a0: 2c 20 73 72 63 22 0a 20 20 20 20 22 20 20 46 52  , src".    "  FR
c0b0: 4f 4d 20 61 74 74 61 63 68 6d 65 6e 74 22 0a 20  OM attachment". 
c0c0: 20 20 20 22 20 57 48 45 52 45 20 73 72 63 3d 28     " WHERE src=(
c0d0: 53 45 4c 45 43 54 20 75 75 69 64 20 46 52 4f 4d  SELECT uuid FROM
c0e0: 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69 64 3d   blob WHERE rid=
c0f0: 25 64 29 22 0a 20 20 20 20 22 20 4f 52 44 45 52  %d)".    " ORDER
c100: 20 42 59 20 6d 74 69 6d 65 20 44 45 53 43 20 2f   BY mtime DESC /
c110: 2a 73 6f 72 74 2a 2f 22 2c 0a 20 20 20 20 72 69  *sort*/",.    ri
c120: 64 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  d.  );.  while( 
c130: 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c  db_step(&q)==SQL
c140: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63  ITE_ROW ){.    c
c150: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67  onst char *zTarg
c160: 65 74 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  et = db_column_t
c170: 65 78 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20  ext(&q, 0);.    
c180: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
c190: 65 6e 61 6d 65 20 3d 20 64 62 5f 63 6f 6c 75 6d  ename = db_colum
c1a0: 6e 5f 74 65 78 74 28 26 71 2c 20 31 29 3b 0a 20  n_text(&q, 1);. 
c1b0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
c1c0: 44 61 74 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  Date = db_column
c1d0: 5f 74 65 78 74 28 26 71 2c 20 32 29 3b 0a 20 20  _text(&q, 2);.  
c1e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
c1f0: 73 65 72 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  ser = db_column_
c200: 74 65 78 74 28 26 71 2c 20 33 29 3b 0a 20 20 20  text(&q, 3);.   
c210: 20 2f 2a 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   /* const char *
c220: 7a 53 72 63 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  zSrc = db_column
c230: 5f 74 65 78 74 28 26 71 2c 20 34 29 3b 20 2a 2f  _text(&q, 4); */
c240: 0a 20 20 20 20 69 66 28 20 63 6e 74 3e 30 20 29  .    if( cnt>0 )
c250: 7b 0a 20 20 20 20 20 20 40 20 41 6c 73 6f 20 61  {.      @ Also a
c260: 74 74 61 63 68 6d 65 6e 74 20 22 25 68 28 7a 46  ttachment "%h(zF
c270: 69 6c 65 6e 61 6d 65 29 22 20 74 6f 0a 20 20 20  ilename)" to.   
c280: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 40 20   }else{.      @ 
c290: 41 74 74 61 63 68 6d 65 6e 74 20 22 25 68 28 7a  Attachment "%h(z
c2a0: 46 69 6c 65 6e 61 6d 65 29 22 20 74 6f 0a 20 20  Filename)" to.  
c2b0: 20 20 7d 0a 20 20 20 20 6f 62 6a 54 79 70 65 20    }.    objType 
c2c0: 7c 3d 20 4f 42 4a 54 59 50 45 5f 41 54 54 41 43  |= OBJTYPE_ATTAC
c2d0: 48 4d 45 4e 54 3b 0a 20 20 20 20 69 66 28 20 66  HMENT;.    if( f
c2e0: 6f 73 73 69 6c 5f 69 73 5f 75 75 69 64 28 7a 54  ossil_is_uuid(zT
c2f0: 61 72 67 65 74 29 20 29 7b 0a 20 20 20 20 20 20  arget) ){.      
c300: 69 66 20 28 20 64 62 5f 65 78 69 73 74 73 28 22  if ( db_exists("
c310: 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 74 61  SELECT 1 FROM ta
c320: 67 20 57 48 45 52 45 20 74 61 67 6e 61 6d 65 3d  g WHERE tagname=
c330: 27 74 6b 74 2d 25 71 27 22 2c 0a 20 20 20 20 20  'tkt-%q'",.     
c340: 20 20 20 20 20 20 20 7a 54 61 72 67 65 74 29 0a         zTarget).
c350: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
c360: 20 69 66 28 20 67 2e 70 65 72 6d 2e 48 79 70 65   if( g.perm.Hype
c370: 72 6c 69 6e 6b 20 26 26 20 67 2e 61 6e 6f 6e 2e  rlink && g.anon.
c380: 52 64 54 6b 74 20 29 7b 0a 20 20 20 20 20 20 20  RdTkt ){.       
c390: 20 20 20 40 20 74 69 63 6b 65 74 20 5b 25 7a 28     @ ticket [%z(
c3a0: 68 72 65 66 28 22 25 52 2f 74 6b 74 76 69 65 77  href("%R/tktview
c3b0: 3f 6e 61 6d 65 3d 25 21 53 22 2c 7a 54 61 72 67  ?name=%!S",zTarg
c3c0: 65 74 29 29 25 53 28 7a 54 61 72 67 65 74 29 3c  et))%S(zTarget)<
c3d0: 2f 61 3e 5d 0a 20 20 20 20 20 20 20 20 7d 65 6c  /a>].        }el
c3e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 40 20  se{.          @ 
c3f0: 74 69 63 6b 65 74 20 5b 25 53 28 7a 54 61 72 67  ticket [%S(zTarg
c400: 65 74 29 5d 0a 20 20 20 20 20 20 20 20 7d 0a 20  et)].        }. 
c410: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64       }else if( d
c420: 62 5f 65 78 69 73 74 73 28 22 53 45 4c 45 43 54  b_exists("SELECT
c430: 20 31 20 46 52 4f 4d 20 74 61 67 20 57 48 45 52   1 FROM tag WHER
c440: 45 20 74 61 67 6e 61 6d 65 3d 27 65 76 65 6e 74  E tagname='event
c450: 2d 25 71 27 22 2c 0a 20 20 20 20 20 20 20 20 20  -%q'",.         
c460: 20 20 20 7a 54 61 72 67 65 74 29 0a 20 20 20 20     zTarget).    
c470: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28    ){.        if(
c480: 20 67 2e 70 65 72 6d 2e 48 79 70 65 72 6c 69 6e   g.perm.Hyperlin
c490: 6b 20 26 26 20 67 2e 61 6e 6f 6e 2e 52 64 57 69  k && g.anon.RdWi
c4a0: 6b 69 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ki ){.          
c4b0: 40 20 74 65 63 68 20 6e 6f 74 65 20 5b 25 7a 28  @ tech note [%z(
c4c0: 68 72 65 66 28 22 25 52 2f 74 65 63 68 6e 6f 74  href("%R/technot
c4d0: 65 2f 25 68 22 2c 7a 54 61 72 67 65 74 29 29 25  e/%h",zTarget))%
c4e0: 53 28 7a 54 61 72 67 65 74 29 3c 2f 61 3e 5d 0a  S(zTarget)</a>].
c4f0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c500: 20 20 20 20 20 20 20 20 20 40 20 74 65 63 68 20           @ tech 
c510: 6e 6f 74 65 20 5b 25 53 28 7a 54 61 72 67 65 74  note [%S(zTarget
c520: 29 5d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  )].        }.   
c530: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c540: 20 20 69 66 28 20 67 2e 70 65 72 6d 2e 48 79 70    if( g.perm.Hyp
c550: 65 72 6c 69 6e 6b 20 26 26 20 67 2e 61 6e 6f 6e  erlink && g.anon
c560: 2e 52 64 57 69 6b 69 20 29 7b 0a 20 20 20 20 20  .RdWiki ){.     
c570: 20 20 20 20 20 40 20 77 69 6b 69 20 70 61 67 65       @ wiki page
c580: 20 5b 25 7a 28 68 72 65 66 28 22 25 52 2f 77 69   [%z(href("%R/wi
c590: 6b 69 3f 6e 61 6d 65 3d 25 74 22 2c 7a 54 61 72  ki?name=%t",zTar
c5a0: 67 65 74 29 29 25 68 28 7a 54 61 72 67 65 74 29  get))%h(zTarget)
c5b0: 3c 2f 61 3e 5d 0a 20 20 20 20 20 20 20 20 7d 65  </a>].        }e
c5c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 40  lse{.          @
c5d0: 20 77 69 6b 69 20 70 61 67 65 20 5b 25 68 28 7a   wiki page [%h(z
c5e0: 54 61 72 67 65 74 29 5d 0a 20 20 20 20 20 20 20  Target)].       
c5f0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
c600: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
c610: 67 2e 70 65 72 6d 2e 48 79 70 65 72 6c 69 6e 6b  g.perm.Hyperlink
c620: 20 26 26 20 67 2e 61 6e 6f 6e 2e 52 64 57 69 6b   && g.anon.RdWik
c630: 69 20 29 7b 0a 20 20 20 20 20 20 20 20 40 20 77  i ){.        @ w
c640: 69 6b 69 20 70 61 67 65 20 5b 25 7a 28 68 72 65  iki page [%z(hre
c650: 66 28 22 25 52 2f 77 69 6b 69 3f 6e 61 6d 65 3d  f("%R/wiki?name=
c660: 25 74 22 2c 7a 54 61 72 67 65 74 29 29 25 68 28  %t",zTarget))%h(
c670: 7a 54 61 72 67 65 74 29 3c 2f 61 3e 5d 0a 20 20  zTarget)</a>].  
c680: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c690: 20 20 20 40 20 77 69 6b 69 20 70 61 67 65 20 5b     @ wiki page [
c6a0: 25 68 28 7a 54 61 72 67 65 74 29 5d 0a 20 20 20  %h(zTarget)].   
c6b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 40     }.    }.    @
c6c0: 20 61 64 64 65 64 20 62 79 0a 20 20 20 20 68 79   added by.    hy
c6d0: 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 73 65 72 28  perlink_to_user(
c6e0: 7a 55 73 65 72 2c 7a 44 61 74 65 2c 22 20 6f 6e  zUser,zDate," on
c6f0: 22 29 3b 0a 20 20 20 20 68 79 70 65 72 6c 69 6e  ");.    hyperlin
c700: 6b 5f 74 6f 5f 64 61 74 65 28 7a 44 61 74 65 2c  k_to_date(zDate,
c710: 22 2e 22 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b  ".");.    cnt++;
c720: 0a 20 20 20 20 69 66 28 20 70 44 6f 77 6e 6c 6f  .    if( pDownlo
c730: 61 64 4e 61 6d 65 20 26 26 20 62 6c 6f 62 5f 73  adName && blob_s
c740: 69 7a 65 28 70 44 6f 77 6e 6c 6f 61 64 4e 61 6d  ize(pDownloadNam
c750: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62  e)==0 ){.      b
c760: 6c 6f 62 5f 61 70 70 65 6e 64 28 70 44 6f 77 6e  lob_append(pDown
c770: 6c 6f 61 64 4e 61 6d 65 2c 20 7a 46 69 6c 65 6e  loadName, zFilen
c780: 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a  ame, -1);.    }.
c790: 20 20 20 20 74 61 67 5f 70 72 69 76 61 74 65 5f      tag_private_
c7a0: 73 74 61 74 75 73 28 72 69 64 29 3b 0a 20 20 7d  status(rid);.  }
c7b0: 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26  .  db_finalize(&
c7c0: 71 29 3b 0a 20 20 69 66 28 20 64 62 5f 65 78 69  q);.  if( db_exi
c7d0: 73 74 73 28 22 53 45 4c 45 43 54 20 31 20 46 52  sts("SELECT 1 FR
c7e0: 4f 4d 20 74 61 67 78 72 65 66 20 57 48 45 52 45  OM tagxref WHERE
c7f0: 20 72 69 64 3d 25 64 20 41 4e 44 20 74 61 67 69   rid=%d AND tagi
c800: 64 3d 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  d=%d",.         
c810: 20 20 20 20 20 20 20 72 69 64 2c 20 54 41 47 5f         rid, TAG_
c820: 43 4c 55 53 54 45 52 29 20 29 7b 0a 20 20 20 20  CLUSTER) ){.    
c830: 40 20 43 6c 75 73 74 65 72 0a 20 20 20 20 63 6e  @ Cluster.    cn
c840: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  t++;.  }.  if( c
c850: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 40 20 55  nt==0 ){.    @ U
c860: 6e 72 65 63 6f 67 6e 69 7a 65 64 20 61 72 74 69  nrecognized arti
c870: 66 61 63 74 0a 20 20 20 20 69 66 28 20 70 44 6f  fact.    if( pDo
c880: 77 6e 6c 6f 61 64 4e 61 6d 65 20 26 26 20 62 6c  wnloadName && bl
c890: 6f 62 5f 73 69 7a 65 28 70 44 6f 77 6e 6c 6f 61  ob_size(pDownloa
c8a0: 64 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  dName)==0 ){.   
c8b0: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
c8c0: 70 44 6f 77 6e 6c 6f 61 64 4e 61 6d 65 2c 20 22  pDownloadName, "
c8d0: 25 53 2e 74 78 74 22 2c 20 7a 55 75 69 64 29 3b  %S.txt", zUuid);
c8e0: 0a 20 20 20 20 7d 0a 20 20 20 20 74 61 67 5f 70  .    }.    tag_p
c8f0: 72 69 76 61 74 65 5f 73 74 61 74 75 73 28 72 69  rivate_status(ri
c900: 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  d);.  }.  return
c910: 20 6f 62 6a 54 79 70 65 3b 0a 7d 0a 0a 0a 2f 2a   objType;.}.../*
c920: 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 66 64 69  .** WEBPAGE: fdi
c930: 66 66 0a 2a 2a 20 55 52 4c 3a 20 66 64 69 66 66  ff.** URL: fdiff
c940: 3f 76 31 3d 55 55 49 44 26 76 32 3d 55 55 49 44  ?v1=UUID&v2=UUID
c950: 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 61 72 67 75 6d  .**.** Two argum
c960: 65 6e 74 73 2c 20 76 31 20 61 6e 64 20 76 32 2c  ents, v1 and v2,
c970: 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 61 72   identify the ar
c980: 74 69 66 61 63 74 73 20 74 6f 20 62 65 20 64 69  tifacts to be di
c990: 66 66 65 64 2e 0a 2a 2a 20 53 68 6f 77 20 64 69  ffed..** Show di
c9a0: 66 66 20 73 69 64 65 20 62 79 20 73 69 64 65 20  ff side by side 
c9b0: 75 6e 6c 65 73 73 20 73 62 73 20 69 73 20 30 2e  unless sbs is 0.
c9c0: 20 20 47 65 6e 65 72 61 74 65 20 70 6c 61 69 6e    Generate plain
c9d0: 20 74 65 78 74 20 69 66 0a 2a 2a 20 22 70 61 74   text if.** "pat
c9e0: 63 68 22 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ch" is present, 
c9f0: 6f 74 68 65 72 77 69 73 65 20 67 65 6e 65 72 61  otherwise genera
ca00: 74 65 20 22 70 72 65 74 74 79 22 20 48 54 4d 4c  te "pretty" HTML
ca10: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74  ..**.** Alternat
ca20: 69 76 65 20 55 52 4c 3a 20 20 66 64 69 66 66 3f  ive URL:  fdiff?
ca30: 66 72 6f 6d 3d 66 69 6c 65 6e 61 6d 65 31 26 74  from=filename1&t
ca40: 6f 3d 66 69 6c 65 6e 61 6d 65 32 26 63 69 3d 63  o=filename2&ci=c
ca50: 68 65 63 6b 69 6e 0a 2a 2a 0a 2a 2a 20 49 66 20  heckin.**.** If 
ca60: 74 68 65 20 22 66 72 6f 6d 22 20 61 6e 64 20 22  the "from" and "
ca70: 74 6f 22 20 71 75 65 72 79 20 70 61 72 61 6d 65  to" query parame
ca80: 74 65 72 73 20 61 72 65 20 62 6f 74 68 20 70 72  ters are both pr
ca90: 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 79  esent, then they
caa0: 20 61 72 65 0a 2a 2a 20 74 68 65 20 6e 61 6d 65   are.** the name
cab0: 73 20 6f 66 20 74 77 6f 20 66 69 6c 65 73 20 77  s of two files w
cac0: 69 74 68 69 6e 20 74 68 65 20 63 68 65 63 6b 2d  ithin the check-
cad0: 69 6e 20 22 63 69 22 20 74 68 61 74 20 61 72 65  in "ci" that are
cae0: 20 64 69 66 66 65 64 2e 20 20 49 66 20 74 68 65   diffed.  If the
caf0: 0a 2a 2a 20 22 63 69 22 20 70 61 72 61 6d 65 74  .** "ci" paramet
cb00: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 2c 20 74  er is omitted, t
cb10: 68 65 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63  hen the most rec
cb20: 65 6e 74 20 63 68 65 63 6b 2d 69 6e 20 28 22 74  ent check-in ("t
cb30: 69 70 22 29 20 69 73 0a 2a 2a 20 75 73 65 64 2e  ip") is.** used.
cb40: 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61  .**.** Additiona
cb50: 6c 20 70 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a  l parameters:.**
cb60: 0a 2a 2a 20 20 20 20 20 20 64 63 3d 4e 20 20 20  .**      dc=N   
cb70: 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 4e            Show N
cb80: 20 6c 69 6e 65 73 20 6f 66 20 63 6f 6e 74 65 78   lines of contex
cb90: 74 20 61 72 6f 75 6e 64 20 65 61 63 68 20 64 69  t around each di
cba0: 66 66 0a 2a 2a 20 20 20 20 20 20 70 61 74 63 68  ff.**      patch
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65 20              Use 
cbc0: 74 68 65 20 70 61 74 63 68 20 64 69 66 66 20 66  the patch diff f
cbd0: 6f 72 6d 61 74 0a 2a 2a 20 20 20 20 20 20 72 65  ormat.**      re
cbe0: 67 65 78 3d 52 45 47 45 58 20 20 20 20 20 20 4f  gex=REGEX      O
cbf0: 6e 6c 79 20 73 68 6f 77 20 64 69 66 66 65 72 65  nly show differe
cc00: 6e 63 65 73 20 74 68 61 74 20 6d 61 74 63 68 20  nces that match 
cc10: 52 45 47 45 58 0a 2a 2a 20 20 20 20 20 20 73 62  REGEX.**      sb
cc20: 73 3d 42 4f 4f 4c 45 41 4e 20 20 20 20 20 20 54  s=BOOLEAN      T
cc30: 75 72 6e 20 73 69 64 65 2d 62 79 2d 73 69 64 65  urn side-by-side
cc40: 20 64 69 66 66 73 20 6f 6e 20 61 6e 64 20 6f 66   diffs on and of
cc50: 66 20 28 64 65 66 61 75 6c 74 3a 20 6f 6e 29 0a  f (default: on).
cc60: 2a 2a 20 20 20 20 20 20 76 65 72 62 6f 73 65 3d  **      verbose=
cc70: 42 4f 4f 4c 45 41 4e 20 20 53 68 6f 77 20 6d 6f  BOOLEAN  Show mo
cc80: 72 65 20 64 65 74 61 69 6c 20 77 68 65 6e 20 64  re detail when d
cc90: 65 73 63 72 69 62 69 6e 67 20 61 72 74 69 66 61  escribing artifa
cca0: 63 74 73 0a 2a 2a 20 20 20 20 20 20 77 3d 42 4f  cts.**      w=BO
ccb0: 4f 4c 45 41 4e 20 20 20 20 20 20 20 20 49 67 6e  OLEAN        Ign
ccc0: 6f 72 65 20 77 68 69 74 65 73 70 61 63 65 0a 2a  ore whitespace.*
ccd0: 2f 0a 76 6f 69 64 20 64 69 66 66 5f 70 61 67 65  /.void diff_page
cce0: 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 76 31  (void){.  int v1
ccf0: 2c 20 76 32 3b 0a 20 20 69 6e 74 20 69 73 50 61  , v2;.  int isPa
cd00: 74 63 68 20 3d 20 50 28 22 70 61 74 63 68 22 29  tch = P("patch")
cd10: 21 3d 30 3b 0a 20 20 69 6e 74 20 64 69 66 66 54  !=0;.  int diffT
cd20: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ype;          /*
cd30: 20 30 3a 20 6e 6f 6e 65 2c 20 31 3a 20 75 6e 69   0: none, 1: uni
cd40: 66 69 65 64 2c 20 20 32 3a 20 73 69 64 65 2d 62  fied,  2: side-b
cd50: 79 2d 73 69 64 65 20 2a 2f 0a 20 20 63 68 61 72  y-side */.  char
cd60: 20 2a 7a 56 31 3b 0a 20 20 63 68 61 72 20 2a 7a   *zV1;.  char *z
cd70: 56 32 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  V2;.  const char
cd80: 20 2a 7a 52 65 3b 0a 20 20 52 65 43 6f 6d 70 69   *zRe;.  ReCompi
cd90: 6c 65 64 20 2a 70 52 65 20 3d 20 30 3b 0a 20 20  led *pRe = 0;.  
cda0: 75 36 34 20 64 69 66 66 46 6c 61 67 73 3b 0a 20  u64 diffFlags;. 
cdb0: 20 75 33 32 20 6f 62 6a 64 65 73 63 46 6c 61 67   u32 objdescFlag
cdc0: 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 76 65 72  s = 0;.  int ver
cdd0: 62 6f 73 65 20 3d 20 50 42 28 22 76 65 72 62 6f  bose = PB("verbo
cde0: 73 65 22 29 3b 0a 0a 20 20 6c 6f 67 69 6e 5f 63  se");..  login_c
cdf0: 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73  heck_credentials
ce00: 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 70 65 72  ();.  if( !g.per
ce10: 6d 2e 52 65 61 64 20 29 7b 20 6c 6f 67 69 6e 5f  m.Read ){ login_
ce20: 6e 65 65 64 65 64 28 67 2e 61 6e 6f 6e 2e 52 65  needed(g.anon.Re
ce30: 61 64 29 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20  ad); return; }. 
ce40: 20 63 6f 6f 6b 69 65 5f 6c 69 6e 6b 5f 70 61 72   cookie_link_par
ce50: 61 6d 65 74 65 72 28 22 64 69 66 66 22 2c 22 64  ameter("diff","d
ce60: 69 66 66 22 2c 22 32 22 29 3b 0a 20 20 64 69 66  iff","2");.  dif
ce70: 66 54 79 70 65 20 3d 20 61 74 6f 69 28 50 44 28  fType = atoi(PD(
ce80: 22 64 69 66 66 22 2c 22 32 22 29 29 3b 0a 20 20  "diff","2"));.  
ce90: 63 6f 6f 6b 69 65 5f 72 65 6e 64 65 72 28 29 3b  cookie_render();
cea0: 0a 20 20 69 66 28 20 50 28 22 66 72 6f 6d 22 29  .  if( P("from")
ceb0: 20 26 26 20 50 28 22 74 6f 22 29 20 29 7b 0a 20   && P("to") ){. 
cec0: 20 20 20 76 31 20 3d 20 61 72 74 69 66 61 63 74     v1 = artifact
ced0: 5f 66 72 6f 6d 5f 63 69 5f 61 6e 64 5f 66 69 6c  _from_ci_and_fil
cee0: 65 6e 61 6d 65 28 30 2c 20 22 66 72 6f 6d 22 29  ename(0, "from")
cef0: 3b 0a 20 20 20 20 76 32 20 3d 20 61 72 74 69 66  ;.    v2 = artif
cf00: 61 63 74 5f 66 72 6f 6d 5f 63 69 5f 61 6e 64 5f  act_from_ci_and_
cf10: 66 69 6c 65 6e 61 6d 65 28 30 2c 20 22 74 6f 22  filename(0, "to"
cf20: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
cf30: 53 74 6d 74 20 71 3b 0a 20 20 20 20 76 31 20 3d  Stmt q;.    v1 =
cf40: 20 6e 61 6d 65 5f 74 6f 5f 72 69 64 5f 77 77 77   name_to_rid_www
cf50: 28 22 76 31 22 29 3b 0a 20 20 20 20 76 32 20 3d  ("v1");.    v2 =
cf60: 20 6e 61 6d 65 5f 74 6f 5f 72 69 64 5f 77 77 77   name_to_rid_www
cf70: 28 22 76 32 22 29 3b 0a 0a 20 20 20 20 2f 2a 20  ("v2");..    /* 
cf80: 49 66 20 74 68 65 20 74 77 6f 20 66 69 6c 65 20  If the two file 
cf90: 76 65 72 73 69 6f 6e 73 20 62 65 69 6e 67 20 63  versions being c
cfa0: 6f 6d 70 61 72 65 64 20 62 6f 74 68 20 68 61 76  ompared both hav
cfb0: 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a  e the same.    *
cfc0: 2a 20 66 69 6c 65 6e 61 6d 65 2c 20 74 68 65 6e  * filename, then
cfd0: 20 6f 66 66 65 72 20 61 6e 20 22 41 6e 6e 6f 74   offer an "Annot
cfe0: 61 74 65 22 20 6c 69 6e 6b 20 74 68 61 74 20 63  ate" link that c
cff0: 6f 6e 73 74 72 75 63 74 73 20 61 6e 0a 20 20 20  onstructs an.   
d000: 20 2a 2a 20 61 6e 6e 6f 74 61 74 69 6f 6e 20 62   ** annotation b
d010: 65 74 77 65 65 6e 20 74 68 6f 73 65 20 76 65 72  etween those ver
d020: 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 64 62 5f  sion. */.    db_
d030: 70 72 65 70 61 72 65 28 26 71 2c 0a 20 20 20 20  prepare(&q,.    
d040: 20 20 22 53 45 4c 45 43 54 20 28 53 45 4c 45 43    "SELECT (SELEC
d050: 54 20 73 75 62 73 74 72 28 75 75 69 64 2c 31 2c  T substr(uuid,1,
d060: 32 30 29 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48  20) FROM blob WH
d070: 45 52 45 20 72 69 64 3d 61 2e 6d 69 64 29 2c 22  ERE rid=a.mid),"
d080: 0a 20 20 20 20 20 20 22 20 20 20 20 20 20 20 28  .      "       (
d090: 53 45 4c 45 43 54 20 73 75 62 73 74 72 28 75 75  SELECT substr(uu
d0a0: 69 64 2c 31 2c 32 30 29 20 46 52 4f 4d 20 62 6c  id,1,20) FROM bl
d0b0: 6f 62 20 57 48 45 52 45 20 72 69 64 3d 62 2e 6d  ob WHERE rid=b.m
d0c0: 69 64 29 2c 22 0a 20 20 20 20 20 20 22 20 20 20  id),".      "   
d0d0: 20 20 20 20 28 53 45 4c 45 43 54 20 6e 61 6d 65      (SELECT name
d0e0: 20 46 52 4f 4d 20 66 69 6c 65 6e 61 6d 65 20 57   FROM filename W
d0f0: 48 45 52 45 20 66 69 6c 65 6e 61 6d 65 2e 66 6e  HERE filename.fn
d100: 69 64 3d 61 2e 66 6e 69 64 29 22 0a 20 20 20 20  id=a.fnid)".    
d110: 20 20 22 20 20 46 52 4f 4d 20 6d 6c 69 6e 6b 20    "  FROM mlink 
d120: 61 2c 20 65 76 65 6e 74 20 65 61 2c 20 6d 6c 69  a, event ea, mli
d130: 6e 6b 20 62 2c 20 65 76 65 6e 74 20 65 62 22 0a  nk b, event eb".
d140: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 61 2e        " WHERE a.
d150: 66 69 64 3d 25 64 22 0a 20 20 20 20 20 20 22 20  fid=%d".      " 
d160: 20 20 41 4e 44 20 62 2e 66 69 64 3d 25 64 22 0a    AND b.fid=%d".
d170: 20 20 20 20 20 20 22 20 20 20 41 4e 44 20 61 2e        "   AND a.
d180: 66 6e 69 64 3d 62 2e 66 6e 69 64 22 0a 20 20 20  fnid=b.fnid".   
d190: 20 20 20 22 20 20 20 41 4e 44 20 61 2e 66 69 64     "   AND a.fid
d1a0: 21 3d 61 2e 70 69 64 22 0a 20 20 20 20 20 20 22  !=a.pid".      "
d1b0: 20 20 20 41 4e 44 20 62 2e 66 69 64 21 3d 62 2e     AND b.fid!=b.
d1c0: 70 69 64 22 0a 20 20 20 20 20 20 22 20 20 20 41  pid".      "   A
d1d0: 4e 44 20 65 61 2e 6f 62 6a 69 64 3d 61 2e 6d 69  ND ea.objid=a.mi
d1e0: 64 22 0a 20 20 20 20 20 20 22 20 20 20 41 4e 44  d".      "   AND
d1f0: 20 65 62 2e 6f 62 6a 69 64 3d 62 2e 6d 69 64 22   eb.objid=b.mid"
d200: 0a 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42  .      " ORDER B
d210: 59 20 65 61 2e 6d 74 69 6d 65 20 41 53 43 2c 20  Y ea.mtime ASC, 
d220: 65 62 2e 6d 74 69 6d 65 20 41 53 43 22 2c 0a 20  eb.mtime ASC",. 
d230: 20 20 20 20 20 76 31 2c 20 76 32 0a 20 20 20 20       v1, v2.    
d240: 29 3b 0a 20 20 20 20 69 66 28 20 64 62 5f 73 74  );.    if( db_st
d250: 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52  ep(&q)==SQLITE_R
d260: 4f 57 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  OW ){.      cons
d270: 74 20 63 68 61 72 20 2a 7a 43 6b 69 6e 20 3d 20  t char *zCkin = 
d280: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
d290: 71 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e  q, 0);.      con
d2a0: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 20 3d  st char *zOrig =
d2b0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28   db_column_text(
d2c0: 26 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 63 6f  &q, 1);.      co
d2d0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 4e 20 3d 20  nst char *zFN = 
d2e0: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
d2f0: 71 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 74 79  q, 2);.      sty
d300: 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65  le_submenu_eleme
d310: 6e 74 28 22 41 6e 6e 6f 74 61 74 65 22 2c 0a 20  nt("Annotate",. 
d320: 20 20 20 20 20 20 20 22 25 52 2f 61 6e 6e 6f 74         "%R/annot
d330: 61 74 65 3f 6f 72 69 67 69 6e 3d 25 73 26 63 68  ate?origin=%s&ch
d340: 65 63 6b 69 6e 3d 25 73 26 66 69 6c 65 6e 61 6d  eckin=%s&filenam
d350: 65 3d 25 54 22 2c 0a 20 20 20 20 20 20 20 20 7a  e=%T",.        z
d360: 4f 72 69 67 2c 20 7a 43 6b 69 6e 2c 20 7a 46 4e  Orig, zCkin, zFN
d370: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 5f  );.    }.    db_
d380: 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20  finalize(&q);.  
d390: 7d 0a 20 20 69 66 28 20 76 31 3d 3d 30 20 7c 7c  }.  if( v1==0 ||
d3a0: 20 76 32 3d 3d 30 20 29 20 66 6f 73 73 69 6c 5f   v2==0 ) fossil_
d3b0: 72 65 64 69 72 65 63 74 5f 68 6f 6d 65 28 29 3b  redirect_home();
d3c0: 0a 20 20 7a 52 65 20 3d 20 50 28 22 72 65 67 65  .  zRe = P("rege
d3d0: 78 22 29 3b 0a 20 20 69 66 28 20 7a 52 65 20 29  x");.  if( zRe )
d3e0: 20 72 65 5f 63 6f 6d 70 69 6c 65 28 26 70 52 65   re_compile(&pRe
d3f0: 2c 20 7a 52 65 2c 20 30 29 3b 0a 20 20 69 66 28  , zRe, 0);.  if(
d400: 20 76 65 72 62 6f 73 65 20 29 20 6f 62 6a 64 65   verbose ) objde
d410: 73 63 46 6c 61 67 73 20 7c 3d 20 4f 42 4a 44 45  scFlags |= OBJDE
d420: 53 43 5f 44 45 54 41 49 4c 3b 0a 20 20 69 66 28  SC_DETAIL;.  if(
d430: 20 69 73 50 61 74 63 68 20 29 7b 0a 20 20 20 20   isPatch ){.    
d440: 42 6c 6f 62 20 63 31 2c 20 63 32 2c 20 2a 70 4f  Blob c1, c2, *pO
d450: 75 74 3b 0a 20 20 20 20 70 4f 75 74 20 3d 20 63  ut;.    pOut = c
d460: 67 69 5f 6f 75 74 70 75 74 5f 62 6c 6f 62 28 29  gi_output_blob()
d470: 3b 0a 20 20 20 20 63 67 69 5f 73 65 74 5f 63 6f  ;.    cgi_set_co
d480: 6e 74 65 6e 74 5f 74 79 70 65 28 22 74 65 78 74  ntent_type("text
d490: 2f 70 6c 61 69 6e 22 29 3b 0a 20 20 20 20 64 69  /plain");.    di
d4a0: 66 66 46 6c 61 67 73 20 3d 20 34 3b 0a 20 20 20  ffFlags = 4;.   
d4b0: 20 63 6f 6e 74 65 6e 74 5f 67 65 74 28 76 31 2c   content_get(v1,
d4c0: 20 26 63 31 29 3b 0a 20 20 20 20 63 6f 6e 74 65   &c1);.    conte
d4d0: 6e 74 5f 67 65 74 28 76 32 2c 20 26 63 32 29 3b  nt_get(v2, &c2);
d4e0: 0a 20 20 20 20 74 65 78 74 5f 64 69 66 66 28 26  .    text_diff(&
d4f0: 63 31 2c 20 26 63 32 2c 20 70 4f 75 74 2c 20 70  c1, &c2, pOut, p
d500: 52 65 2c 20 64 69 66 66 46 6c 61 67 73 29 3b 0a  Re, diffFlags);.
d510: 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26      blob_reset(&
d520: 63 31 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65  c1);.    blob_re
d530: 73 65 74 28 26 63 32 29 3b 0a 20 20 20 20 72 65  set(&c2);.    re
d540: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 7a 56 31  turn;.  }..  zV1
d550: 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53   = db_text(0, "S
d560: 45 4c 45 43 54 20 75 75 69 64 20 46 52 4f 4d 20  ELECT uuid FROM 
d570: 62 6c 6f 62 20 57 48 45 52 45 20 72 69 64 3d 25  blob WHERE rid=%
d580: 64 22 2c 20 76 31 29 3b 0a 20 20 7a 56 32 20 3d  d", v1);.  zV2 =
d590: 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c   db_text(0, "SEL
d5a0: 45 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62 6c  ECT uuid FROM bl
d5b0: 6f 62 20 57 48 45 52 45 20 72 69 64 3d 25 64 22  ob WHERE rid=%d"
d5c0: 2c 20 76 32 29 3b 0a 20 20 64 69 66 66 46 6c 61  , v2);.  diffFla
d5d0: 67 73 20 3d 20 63 6f 6e 73 74 72 75 63 74 5f 64  gs = construct_d
d5e0: 69 66 66 5f 66 6c 61 67 73 28 64 69 66 66 54 79  iff_flags(diffTy
d5f0: 70 65 29 20 7c 20 44 49 46 46 5f 48 54 4d 4c 3b  pe) | DIFF_HTML;
d600: 0a 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72  ..  style_header
d610: 28 22 44 69 66 66 22 29 3b 0a 20 20 73 74 79 6c  ("Diff");.  styl
d620: 65 5f 73 75 62 6d 65 6e 75 5f 63 68 65 63 6b 62  e_submenu_checkb
d630: 6f 78 28 22 77 22 2c 20 22 49 67 6e 6f 72 65 20  ox("w", "Ignore 
d640: 57 68 69 74 65 73 70 61 63 65 22 2c 20 30 2c 20  Whitespace", 0, 
d650: 30 29 3b 0a 20 20 69 66 28 20 64 69 66 66 54 79  0);.  if( diffTy
d660: 70 65 3d 3d 32 20 29 7b 0a 20 20 20 20 73 74 79  pe==2 ){.    sty
d670: 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65  le_submenu_eleme
d680: 6e 74 28 22 55 6e 69 66 69 65 64 20 44 69 66 66  nt("Unified Diff
d690: 22 2c 20 22 25 52 2f 66 64 69 66 66 3f 76 31 3d  ", "%R/fdiff?v1=
d6a0: 25 54 26 76 32 3d 25 54 26 64 69 66 66 3d 31 22  %T&v2=%T&diff=1"
d6b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 28 22               P("
d6d0: 76 31 22 29 2c 20 50 28 22 76 32 22 29 29 3b 0a  v1"), P("v2"));.
d6e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 79    }else{.    sty
d6f0: 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65  le_submenu_eleme
d700: 6e 74 28 22 53 69 64 65 2d 62 79 2d 73 69 64 65  nt("Side-by-side
d710: 20 44 69 66 66 22 2c 20 22 25 52 2f 66 64 69 66   Diff", "%R/fdif
d720: 66 3f 76 31 3d 25 54 26 76 32 3d 25 54 26 64 69  f?v1=%T&v2=%T&di
d730: 66 66 3d 32 22 2c 0a 20 20 20 20 20 20 20 20 20  ff=2",.         
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d750: 20 20 50 28 22 76 31 22 29 2c 20 50 28 22 76 32    P("v1"), P("v2
d760: 22 29 29 3b 0a 20 20 7d 0a 20 20 73 74 79 6c 65  "));.  }.  style
d770: 5f 73 75 62 6d 65 6e 75 5f 63 68 65 63 6b 62 6f  _submenu_checkbo
d780: 78 28 22 76 65 72 62 6f 73 65 22 2c 20 22 56 65  x("verbose", "Ve
d790: 72 62 6f 73 65 22 2c 20 30 2c 20 30 29 3b 0a 20  rbose", 0, 0);. 
d7a0: 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65   style_submenu_e
d7b0: 6c 65 6d 65 6e 74 28 22 50 61 74 63 68 22 2c 20  lement("Patch", 
d7c0: 22 25 52 2f 66 64 69 66 66 3f 76 31 3d 25 54 26  "%R/fdiff?v1=%T&
d7d0: 76 32 3d 25 54 26 70 61 74 63 68 22 2c 0a 20 20  v2=%T&patch",.  
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7f0: 20 20 20 20 20 20 50 28 22 76 31 22 29 2c 20 50        P("v1"), P
d800: 28 22 76 32 22 29 29 3b 0a 0a 20 20 69 66 28 20  ("v2"));..  if( 
d810: 50 28 22 73 6d 68 64 72 22 29 21 3d 30 20 29 7b  P("smhdr")!=0 ){
d820: 0a 20 20 20 20 40 20 3c 68 32 3e 44 69 66 66 65  .    @ <h2>Diffe
d830: 72 65 6e 63 65 73 20 46 72 6f 6d 20 41 72 74 69  rences From Arti
d840: 66 61 63 74 0a 20 20 20 20 40 20 25 7a 28 68 72  fact.    @ %z(hr
d850: 65 66 28 22 25 52 2f 61 72 74 69 66 61 63 74 2f  ef("%R/artifact/
d860: 25 21 53 22 2c 7a 56 31 29 29 5b 25 53 28 7a 56  %!S",zV1))[%S(zV
d870: 31 29 5d 3c 2f 61 3e 20 54 6f 0a 20 20 20 20 40  1)]</a> To.    @
d880: 20 25 7a 28 68 72 65 66 28 22 25 52 2f 61 72 74   %z(href("%R/art
d890: 69 66 61 63 74 2f 25 21 53 22 2c 7a 56 32 29 29  ifact/%!S",zV2))
d8a0: 5b 25 53 28 7a 56 32 29 5d 3c 2f 61 3e 2e 3c 2f  [%S(zV2)]</a>.</
d8b0: 68 32 3e 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  h2>.  }else{.   
d8c0: 20 40 20 3c 68 32 3e 44 69 66 66 65 72 65 6e 63   @ <h2>Differenc
d8d0: 65 73 20 46 72 6f 6d 0a 20 20 20 20 40 20 41 72  es From.    @ Ar
d8e0: 74 69 66 61 63 74 20 25 7a 28 68 72 65 66 28 22  tifact %z(href("
d8f0: 25 52 2f 61 72 74 69 66 61 63 74 2f 25 21 53 22  %R/artifact/%!S"
d900: 2c 7a 56 31 29 29 5b 25 53 28 7a 56 31 29 5d 3c  ,zV1))[%S(zV1)]<
d910: 2f 61 3e 3a 3c 2f 68 32 3e 0a 20 20 20 20 6f 62  /a>:</h2>.    ob
d920: 6a 65 63 74 5f 64 65 73 63 72 69 70 74 69 6f 6e  ject_description
d930: 28 76 31 2c 20 6f 62 6a 64 65 73 63 46 6c 61 67  (v1, objdescFlag
d940: 73 2c 20 30 29 3b 0a 20 20 20 20 40 20 3c 68 32  s, 0);.    @ <h2
d950: 3e 54 6f 20 41 72 74 69 66 61 63 74 20 25 7a 28  >To Artifact %z(
d960: 68 72 65 66 28 22 25 52 2f 61 72 74 69 66 61 63  href("%R/artifac
d970: 74 2f 25 21 53 22 2c 7a 56 32 29 29 5b 25 53 28  t/%!S",zV2))[%S(
d980: 7a 56 32 29 5d 3c 2f 61 3e 3a 3c 2f 68 32 3e 0a  zV2)]</a>:</h2>.
d990: 20 20 20 20 6f 62 6a 65 63 74 5f 64 65 73 63 72      object_descr
d9a0: 69 70 74 69 6f 6e 28 76 32 2c 20 6f 62 6a 64 65  iption(v2, objde
d9b0: 73 63 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d  scFlags, 0);.  }
d9c0: 0a 20 20 69 66 28 20 70 52 65 20 29 7b 0a 20 20  .  if( pRe ){.  
d9d0: 20 20 40 20 3c 62 3e 4f 6e 6c 79 20 64 69 66 66    @ <b>Only diff
d9e0: 65 72 65 6e 63 65 73 20 74 68 61 74 20 6d 61 74  erences that mat
d9f0: 63 68 20 72 65 67 75 6c 61 72 20 65 78 70 72 65  ch regular expre
da00: 73 73 69 6f 6e 20 22 25 68 28 7a 52 65 29 22 0a  ssion "%h(zRe)".
da10: 20 20 20 20 40 20 61 72 65 20 73 68 6f 77 6e 2e      @ are shown.
da20: 3c 2f 62 3e 0a 20 20 7d 0a 20 20 40 20 3c 68 72  </b>.  }.  @ <hr
da30: 20 2f 3e 0a 20 20 61 70 70 65 6e 64 5f 64 69 66   />.  append_dif
da40: 66 28 7a 56 31 2c 20 7a 56 32 2c 20 64 69 66 66  f(zV1, zV2, diff
da50: 46 6c 61 67 73 2c 20 70 52 65 29 3b 0a 20 20 61  Flags, pRe);.  a
da60: 70 70 65 6e 64 5f 64 69 66 66 5f 6a 61 76 61 73  ppend_diff_javas
da70: 63 72 69 70 74 28 64 69 66 66 54 79 70 65 29 3b  cript(diffType);
da80: 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28  .  style_footer(
da90: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50  );.}../*.** WEBP
daa0: 41 47 45 3a 20 72 61 77 0a 2a 2a 20 55 52 4c 3a  AGE: raw.** URL:
dab0: 20 2f 72 61 77 3f 6e 61 6d 65 3d 41 52 54 49 46   /raw?name=ARTIF
dac0: 41 43 54 49 44 26 6d 3d 54 59 50 45 0a 2a 2a 20  ACTID&m=TYPE.** 
dad0: 55 52 4c 3a 20 2f 72 61 77 3f 63 69 3d 42 52 41  URL: /raw?ci=BRA
dae0: 4e 43 48 26 66 69 6c 65 6e 61 6d 65 3d 4e 41 4d  NCH&filename=NAM
daf0: 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  E.**.** Return t
db00: 68 65 20 75 6e 69 6e 74 65 72 70 72 65 74 65 64  he uninterpreted
db10: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 61   content of an a
db20: 72 74 69 66 61 63 74 2e 20 20 55 73 65 64 20 70  rtifact.  Used p
db30: 72 69 6d 61 72 69 6c 79 0a 2a 2a 20 74 6f 20 76  rimarily.** to v
db40: 69 65 77 20 61 72 74 69 66 61 63 74 73 20 74 68  iew artifacts th
db50: 61 74 20 61 72 65 20 69 6d 61 67 65 73 2e 0a 2a  at are images..*
db60: 2f 0a 76 6f 69 64 20 72 61 77 61 72 74 69 66 61  /.void rawartifa
db70: 63 74 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20  ct_page(void){. 
db80: 20 69 6e 74 20 72 69 64 20 3d 20 30 3b 0a 20 20   int rid = 0;.  
db90: 63 68 61 72 20 2a 7a 55 75 69 64 3b 0a 0a 20 20  char *zUuid;..  
dba0: 69 66 28 20 50 28 22 63 69 22 29 20 26 26 20 50  if( P("ci") && P
dbb0: 28 22 66 69 6c 65 6e 61 6d 65 22 29 20 29 7b 0a  ("filename") ){.
dbc0: 20 20 20 20 72 69 64 20 3d 20 61 72 74 69 66 61      rid = artifa
dbd0: 63 74 5f 66 72 6f 6d 5f 63 69 5f 61 6e 64 5f 66  ct_from_ci_and_f
dbe0: 69 6c 65 6e 61 6d 65 28 30 2c 20 30 29 3b 0a 20  ilename(0, 0);. 
dbf0: 20 7d 0a 20 20 69 66 28 20 72 69 64 3d 3d 30 20   }.  if( rid==0 
dc00: 29 7b 0a 20 20 20 20 72 69 64 20 3d 20 6e 61 6d  ){.    rid = nam
dc10: 65 5f 74 6f 5f 72 69 64 5f 77 77 77 28 22 6e 61  e_to_rid_www("na
dc20: 6d 65 22 29 3b 0a 20 20 7d 0a 20 20 6c 6f 67 69  me");.  }.  logi
dc30: 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69  n_check_credenti
dc40: 61 6c 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e  als();.  if( !g.
dc50: 70 65 72 6d 2e 52 65 61 64 20 29 7b 20 6c 6f 67  perm.Read ){ log
dc60: 69 6e 5f 6e 65 65 64 65 64 28 67 2e 61 6e 6f 6e  in_needed(g.anon
dc70: 2e 52 65 61 64 29 3b 20 72 65 74 75 72 6e 3b 20  .Read); return; 
dc80: 7d 0a 20 20 69 66 28 20 72 69 64 3d 3d 30 20 29  }.  if( rid==0 )
dc90: 20 66 6f 73 73 69 6c 5f 72 65 64 69 72 65 63 74   fossil_redirect
dca0: 5f 68 6f 6d 65 28 29 3b 0a 20 20 7a 55 75 69 64  _home();.  zUuid
dcb0: 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53   = db_text(0, "S
dcc0: 45 4c 45 43 54 20 75 75 69 64 20 46 52 4f 4d 20  ELECT uuid FROM 
dcd0: 62 6c 6f 62 20 57 48 45 52 45 20 72 69 64 3d 25  blob WHERE rid=%
dce0: 64 22 2c 20 72 69 64 29 3b 0a 20 20 69 66 28 20  d", rid);.  if( 
dcf0: 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 50 28  fossil_strcmp(P(
dd00: 22 6e 61 6d 65 22 29 2c 20 7a 55 75 69 64 29 3d  "name"), zUuid)=
dd10: 3d 30 20 26 26 20 6c 6f 67 69 6e 5f 69 73 5f 6e  =0 && login_is_n
dd20: 6f 62 6f 64 79 28 29 20 29 7b 0a 20 20 20 20 67  obody() ){.    g
dd30: 2e 69 73 43 6f 6e 73 74 20 3d 20 31 3b 0a 20 20  .isConst = 1;.  
dd40: 7d 0a 20 20 66 72 65 65 28 7a 55 75 69 64 29 3b  }.  free(zUuid);
dd50: 0a 20 20 64 65 6c 69 76 65 72 5f 61 72 74 69 66  .  deliver_artif
dd60: 61 63 74 28 72 69 64 2c 20 50 28 22 6d 22 29 29  act(rid, P("m"))
dd70: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50  ;.}.../*.** WEBP
dd80: 41 47 45 3a 20 73 65 63 75 72 65 72 61 77 0a 2a  AGE: secureraw.*
dd90: 2a 20 55 52 4c 3a 20 2f 73 65 63 75 72 65 72 61  * URL: /securera
dda0: 77 2f 48 41 53 48 3f 6d 3d 54 59 50 45 0a 2a 2a  w/HASH?m=TYPE.**
ddb0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75  .** Return the u
ddc0: 6e 69 6e 74 65 72 70 72 65 74 65 64 20 63 6f 6e  ninterpreted con
ddd0: 74 65 6e 74 20 6f 66 20 61 6e 20 61 72 74 69 66  tent of an artif
dde0: 61 63 74 2e 20 20 54 68 69 73 20 69 73 20 73 69  act.  This is si
ddf0: 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 2f 72 61 77  milar.** to /raw
de00: 20 65 78 63 65 70 74 20 69 6e 20 74 68 69 73 20   except in this 
de10: 63 61 73 65 20 74 68 65 20 6f 6e 6c 79 20 77 61  case the only wa
de20: 79 20 74 6f 20 73 70 65 63 69 66 79 20 74 68 65  y to specify the
de30: 20 61 72 74 69 66 61 63 74 0a 2a 2a 20 69 73 20   artifact.** is 
de40: 62 79 20 74 68 65 20 66 75 6c 6c 2d 6c 65 6e 67  by the full-leng
de50: 74 68 20 53 48 41 31 20 6f 72 20 53 48 41 33 20  th SHA1 or SHA3 
de60: 68 61 73 68 2e 20 20 41 62 62 72 65 76 69 61 74  hash.  Abbreviat
de70: 69 6f 6e 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20  ions are not.** 
de80: 61 63 63 65 70 74 65 64 2e 0a 2a 2f 0a 76 6f 69  accepted..*/.voi
de90: 64 20 73 65 63 75 72 65 5f 72 61 77 61 72 74 69  d secure_rawarti
dea0: 66 61 63 74 5f 70 61 67 65 28 76 6f 69 64 29 7b  fact_page(void){
deb0: 0a 20 20 69 6e 74 20 72 69 64 20 3d 20 30 3b 0a  .  int rid = 0;.
dec0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
ded0: 75 69 64 20 3d 20 50 44 28 22 6e 61 6d 65 22 2c  uid = PD("name",
dee0: 20 22 22 29 3b 0a 0a 20 20 6c 6f 67 69 6e 5f 63   "");..  login_c
def0: 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73  heck_credentials
df00: 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 70 65 72  ();.  if( !g.per
df10: 6d 2e 52 65 61 64 20 29 7b 20 6c 6f 67 69 6e 5f  m.Read ){ login_
df20: 6e 65 65 64 65 64 28 67 2e 61 6e 6f 6e 2e 52 65  needed(g.anon.Re
df30: 61 64 29 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20  ad); return; }. 
df40: 20 72 69 64 20 3d 20 64 62 5f 69 6e 74 28 30 2c   rid = db_int(0,
df50: 20 22 53 45 4c 45 43 54 20 72 69 64 20 46 52 4f   "SELECT rid FRO
df60: 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 75 75 69  M blob WHERE uui
df70: 64 3d 25 51 22 2c 20 7a 55 75 69 64 29 3b 0a 20  d=%Q", zUuid);. 
df80: 20 69 66 28 20 72 69 64 3d 3d 30 20 29 7b 0a 20   if( rid==0 ){. 
df90: 20 20 20 63 67 69 5f 73 65 74 5f 73 74 61 74 75     cgi_set_statu
dfa0: 73 28 34 30 34 2c 20 22 4e 6f 74 20 46 6f 75 6e  s(404, "Not Foun
dfb0: 64 22 29 3b 0a 20 20 20 20 40 20 55 6e 6b 6e 6f  d");.    @ Unkno
dfc0: 77 6e 20 61 72 74 69 66 61 63 74 3a 20 22 25 68  wn artifact: "%h
dfd0: 28 7a 55 75 69 64 29 22 0a 20 20 20 20 72 65 74  (zUuid)".    ret
dfe0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 67 2e 69 73 43  urn;.  }.  g.isC
dff0: 6f 6e 73 74 20 3d 20 31 3b 0a 20 20 64 65 6c 69  onst = 1;.  deli
e000: 76 65 72 5f 61 72 74 69 66 61 63 74 28 72 69 64  ver_artifact(rid
e010: 2c 20 50 28 22 6d 22 29 29 3b 0a 7d 0a 0a 0a 2f  , P("m"));.}.../
e020: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
e030: 76 65 72 62 61 74 69 6d 20 61 72 74 69 66 61 63  verbatim artifac
e040: 74 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20  t as the result 
e050: 6f 66 20 61 6e 20 48 54 54 50 20 72 65 71 75 65  of an HTTP reque
e060: 73 74 2e 0a 2a 2a 20 49 66 20 7a 4d 69 6d 65 20  st..** If zMime 
e070: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 75 73 65  is not NULL, use
e080: 20 69 74 20 61 73 20 74 68 65 20 4d 49 4d 45 2d   it as the MIME-
e090: 74 79 70 65 2e 20 20 49 66 20 7a 4d 69 6d 65 20  type.  If zMime 
e0a0: 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 67 75 65 73  is.** NULL, gues
e0b0: 73 20 61 74 20 74 68 65 20 4d 49 4d 45 2d 74 79  s at the MIME-ty
e0c0: 70 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  pe based on the 
e0d0: 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 73 73 6f  filename.** asso
e0e0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
e0f0: 61 72 74 69 66 61 63 74 2e 0a 2a 2f 0a 76 6f 69  artifact..*/.voi
e100: 64 20 64 65 6c 69 76 65 72 5f 61 72 74 69 66 61  d deliver_artifa
e110: 63 74 28 69 6e 74 20 72 69 64 2c 20 63 6f 6e 73  ct(int rid, cons
e120: 74 20 63 68 61 72 20 2a 7a 4d 69 6d 65 29 7b 0a  t char *zMime){.
e130: 20 20 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a    Blob content;.
e140: 20 20 69 66 28 20 7a 4d 69 6d 65 3d 3d 30 20 29    if( zMime==0 )
e150: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 4e 61  {.    char *zFNa
e160: 6d 65 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20  me = db_text(0, 
e170: 22 53 45 4c 45 43 54 20 66 69 6c 65 6e 61 6d 65  "SELECT filename
e180: 2e 6e 61 6d 65 20 46 52 4f 4d 20 6d 6c 69 6e 6b  .name FROM mlink
e190: 2c 20 66 69 6c 65 6e 61 6d 65 22 0a 20 20 20 20  , filename".    
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1b0: 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
e1c0: 45 20 6d 6c 69 6e 6b 2e 66 69 64 3d 25 64 22 0a  E mlink.fid=%d".
e1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
e1f0: 20 20 41 4e 44 20 66 69 6c 65 6e 61 6d 65 2e 66    AND filename.f
e200: 6e 69 64 3d 6d 6c 69 6e 6b 2e 66 6e 69 64 22 2c  nid=mlink.fnid",
e210: 20 72 69 64 29 3b 0a 20 20 20 20 69 66 28 20 21   rid);.    if( !
e220: 7a 46 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  zFName ){.      
e230: 2f 2a 20 4c 6f 6f 6b 20 61 6c 73 6f 20 61 74 20  /* Look also at 
e240: 74 68 65 20 61 74 74 61 63 68 6d 65 6e 74 20 74  the attachment t
e250: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 46  able */.      zF
e260: 4e 61 6d 65 20 3d 20 64 62 5f 74 65 78 74 28 30  Name = db_text(0
e270: 2c 20 22 53 45 4c 45 43 54 20 61 74 74 61 63 68  , "SELECT attach
e280: 6d 65 6e 74 2e 66 69 6c 65 6e 61 6d 65 20 46 52  ment.filename FR
e290: 4f 4d 20 61 74 74 61 63 68 6d 65 6e 74 2c 20 62  OM attachment, b
e2a0: 6c 6f 62 22 0a 20 20 20 20 20 20 20 20 20 20 20  lob".           
e2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
e2c0: 20 57 48 45 52 45 20 62 6c 6f 62 2e 72 69 64 3d   WHERE blob.rid=
e2d0: 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
e2f0: 20 20 41 4e 44 20 61 74 74 61 63 68 6d 65 6e 74    AND attachment
e300: 2e 73 72 63 3d 62 6c 6f 62 2e 75 75 69 64 22 2c  .src=blob.uuid",
e310: 20 72 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20   rid);.    }.   
e320: 20 69 66 28 20 7a 46 4e 61 6d 65 20 29 20 7a 4d   if( zFName ) zM
e330: 69 6d 65 20 3d 20 6d 69 6d 65 74 79 70 65 5f 66  ime = mimetype_f
e340: 72 6f 6d 5f 6e 61 6d 65 28 7a 46 4e 61 6d 65 29  rom_name(zFName)
e350: 3b 0a 20 20 20 20 69 66 28 20 7a 4d 69 6d 65 3d  ;.    if( zMime=
e360: 3d 30 20 29 20 7a 4d 69 6d 65 20 3d 20 22 61 70  =0 ) zMime = "ap
e370: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 66 6f 73 73  plication/x-foss
e380: 69 6c 2d 61 72 74 69 66 61 63 74 22 3b 0a 20 20  il-artifact";.  
e390: 7d 0a 20 20 63 6f 6e 74 65 6e 74 5f 67 65 74 28  }.  content_get(
e3a0: 72 69 64 2c 20 26 63 6f 6e 74 65 6e 74 29 3b 0a  rid, &content);.
e3b0: 20 20 63 67 69 5f 73 65 74 5f 63 6f 6e 74 65 6e    cgi_set_conten
e3c0: 74 5f 74 79 70 65 28 7a 4d 69 6d 65 29 3b 0a 20  t_type(zMime);. 
e3d0: 20 63 67 69 5f 73 65 74 5f 63 6f 6e 74 65 6e 74   cgi_set_content
e3e0: 28 26 63 6f 6e 74 65 6e 74 29 3b 0a 7d 0a 0a 2f  (&content);.}../
e3f0: 2a 0a 2a 2a 20 52 65 6e 64 65 72 20 61 20 68 65  *.** Render a he
e400: 78 20 64 75 6d 70 20 6f 66 20 61 20 66 69 6c 65  x dump of a file
e410: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e420: 20 68 65 78 64 75 6d 70 28 42 6c 6f 62 20 2a 70   hexdump(Blob *p
e430: 42 6c 6f 62 29 7b 0a 20 20 63 6f 6e 73 74 20 75  Blob){.  const u
e440: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 78 3b  nsigned char *x;
e450: 0a 20 20 69 6e 74 20 6e 2c 20 69 2c 20 6a 2c 20  .  int n, i, j, 
e460: 6b 3b 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b  k;.  char zLine[
e470: 31 30 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63  100];.  static c
e480: 6f 6e 73 74 20 63 68 61 72 20 7a 48 65 78 5b 5d  onst char zHex[]
e490: 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 61 62   = "0123456789ab
e4a0: 63 64 65 66 22 3b 0a 0a 20 20 78 20 3d 20 28 63  cdef";..  x = (c
e4b0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
e4c0: 61 72 2a 29 62 6c 6f 62 5f 62 75 66 66 65 72 28  ar*)blob_buffer(
e4d0: 70 42 6c 6f 62 29 3b 0a 20 20 6e 20 3d 20 62 6c  pBlob);.  n = bl
e4e0: 6f 62 5f 73 69 7a 65 28 70 42 6c 6f 62 29 3b 0a  ob_size(pBlob);.
e4f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
e500: 69 2b 3d 31 36 29 7b 0a 20 20 20 20 6a 20 3d 20  i+=16){.    j = 
e510: 30 3b 0a 20 20 20 20 7a 4c 69 6e 65 5b 30 5d 20  0;.    zLine[0] 
e520: 3d 20 7a 48 65 78 5b 28 69 3e 3e 32 34 29 26 30  = zHex[(i>>24)&0
e530: 78 66 5d 3b 0a 20 20 20 20 7a 4c 69 6e 65 5b 31  xf];.    zLine[1
e540: 5d 20 3d 20 7a 48 65 78 5b 28 69 3e 3e 31 36 29  ] = zHex[(i>>16)
e550: 26 30 78 66 5d 3b 0a 20 20 20 20 7a 4c 69 6e 65  &0xf];.    zLine
e560: 5b 32 5d 20 3d 20 7a 48 65 78 5b 28 69 3e 3e 38  [2] = zHex[(i>>8
e570: 29 26 30 78 66 5d 3b 0a 20 20 20 20 7a 4c 69 6e  )&0xf];.    zLin
e580: 65 5b 33 5d 20 3d 20 7a 48 65 78 5b 69 26 30 78  e[3] = zHex[i&0x
e590: 66 5d 3b 0a 20 20 20 20 7a 4c 69 6e 65 5b 34 5d  f];.    zLine[4]
e5a0: 20 3d 20 27 3a 27 3b 0a 20 20 20 20 73 71 6c 69   = ':';.    sqli
e5b0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
e5c0: 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 7a 4c 69 6e  eof(zLine), zLin
e5d0: 65 2c 20 22 25 30 34 78 3a 20 22 2c 20 69 29 3b  e, "%04x: ", i);
e5e0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
e5f0: 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  16; j++){.      
e600: 6b 20 3d 20 35 2b 6a 2a 33 3b 0a 20 20 20 20 20  k = 5+j*3;.     
e610: 20 7a 4c 69 6e 65 5b 6b 5d 20 3d 20 27 20 27 3b   zLine[k] = ' ';
e620: 0a 20 20 20 20 20 20 69 66 28 20 69 2b 6a 3c 6e  .      if( i+j<n
e630: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69   ){.        unsi
e640: 67 6e 65 64 20 63 68 61 72 20 63 20 3d 20 78 5b  gned char c = x[
e650: 69 2b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 7a 4c  i+j];.        zL
e660: 69 6e 65 5b 6b 2b 31 5d 20 3d 20 7a 48 65 78 5b  ine[k+1] = zHex[
e670: 63 3e 3e 34 5d 3b 0a 20 20 20 20 20 20 20 20 7a  c>>4];.        z
e680: 4c 69 6e 65 5b 6b 2b 32 5d 20 3d 20 7a 48 65 78  Line[k+2] = zHex
e690: 5b 63 26 30 78 66 5d 3b 0a 20 20 20 20 20 20 7d  [c&0xf];.      }
e6a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c  else{.        zL
e6b0: 69 6e 65 5b 6b 2b 31 5d 20 3d 20 27 20 27 3b 0a  ine[k+1] = ' ';.
e6c0: 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6b 2b          zLine[k+
e6d0: 32 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  2] = ' ';.      
e6e0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4c 69 6e  }.    }.    zLin
e6f0: 65 5b 35 33 5d 20 3d 20 27 20 27 3b 0a 20 20 20  e[53] = ' ';.   
e700: 20 7a 4c 69 6e 65 5b 35 34 5d 20 3d 20 27 20 27   zLine[54] = ' '
e710: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
e720: 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  <16; j++){.     
e730: 20 6b 20 3d 20 6a 2b 35 35 3b 0a 20 20 20 20 20   k = j+55;.     
e740: 20 69 66 28 20 69 2b 6a 3c 6e 20 29 7b 0a 20 20   if( i+j<n ){.  
e750: 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
e760: 68 61 72 20 63 20 3d 20 78 5b 69 2b 6a 5d 3b 0a  har c = x[i+j];.
e770: 20 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d 30          if( c>=0
e780: 78 32 30 20 26 26 20 63 3c 3d 30 78 37 65 20 29  x20 && c<=0x7e )
e790: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4c 69 6e  {.          zLin
e7a0: 65 5b 6b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20  e[k] = c;.      
e7b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e7c0: 20 20 20 7a 4c 69 6e 65 5b 6b 5d 20 3d 20 27 2e     zLine[k] = '.
e7d0: 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ';.        }.   
e7e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e7f0: 20 20 7a 4c 69 6e 65 5b 6b 5d 20 3d 20 30 3b 0a    zLine[k] = 0;.
e800: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e810: 20 20 7a 4c 69 6e 65 5b 37 31 5d 20 3d 20 30 3b    zLine[71] = 0;
e820: 0a 20 20 20 20 40 20 25 68 28 7a 4c 69 6e 65 29  .    @ %h(zLine)
e830: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45  .  }.}../*.** WE
e840: 42 50 41 47 45 3a 20 68 65 78 64 75 6d 70 0a 2a  BPAGE: hexdump.*
e850: 2a 20 55 52 4c 3a 20 2f 68 65 78 64 75 6d 70 3f  * URL: /hexdump?
e860: 6e 61 6d 65 3d 41 52 54 49 46 41 43 54 49 44 0a  name=ARTIFACTID.
e870: 2a 2a 0a 2a 2a 20 53 68 6f 77 20 74 68 65 20 63  **.** Show the c
e880: 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20  omplete content 
e890: 6f 66 20 61 20 66 69 6c 65 20 69 64 65 6e 74 69  of a file identi
e8a0: 66 69 65 64 20 62 79 20 41 52 54 49 46 41 43 54  fied by ARTIFACT
e8b0: 49 44 0a 2a 2a 20 61 73 20 70 72 65 66 6f 72 6d  ID.** as preform
e8c0: 61 74 74 65 64 20 74 65 78 74 2e 0a 2a 2a 0a 2a  atted text..**.*
e8d0: 2a 20 4f 74 68 65 72 20 70 61 72 61 6d 65 74 65  * Other paramete
e8e0: 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 76 65  rs:.**.**     ve
e8f0: 72 62 6f 73 65 20 20 20 20 20 20 20 20 20 20 20  rbose           
e900: 20 20 20 53 68 6f 77 20 6d 6f 72 65 20 64 65 74     Show more det
e910: 61 69 6c 20 77 68 65 6e 20 64 65 73 63 72 69 62  ail when describ
e920: 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74 0a 2a  ing the object.*
e930: 2f 0a 76 6f 69 64 20 68 65 78 64 75 6d 70 5f 70  /.void hexdump_p
e940: 61 67 65 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74  age(void){.  int
e950: 20 72 69 64 3b 0a 20 20 42 6c 6f 62 20 63 6f 6e   rid;.  Blob con
e960: 74 65 6e 74 3b 0a 20 20 42 6c 6f 62 20 64 6f 77  tent;.  Blob dow
e970: 6e 6c 6f 61 64 4e 61 6d 65 3b 0a 20 20 63 68 61  nloadName;.  cha
e980: 72 20 2a 7a 55 75 69 64 3b 0a 20 20 75 33 32 20  r *zUuid;.  u32 
e990: 6f 62 6a 64 65 73 63 46 6c 61 67 73 20 3d 20 30  objdescFlags = 0
e9a0: 3b 0a 0a 20 20 72 69 64 20 3d 20 6e 61 6d 65 5f  ;..  rid = name_
e9b0: 74 6f 5f 72 69 64 5f 77 77 77 28 22 6e 61 6d 65  to_rid_www("name
e9c0: 22 29 3b 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63  ");.  login_chec
e9d0: 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b  k_credentials();
e9e0: 0a 20 20 69 66 28 20 21 67 2e 70 65 72 6d 2e 52  .  if( !g.perm.R
e9f0: 65 61 64 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65  ead ){ login_nee
ea00: 64 65 64 28 67 2e 61 6e 6f 6e 2e 52 65 61 64 29  ded(g.anon.Read)
ea10: 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 69 66  ; return; }.  if
ea20: 28 20 72 69 64 3d 3d 30 20 29 20 66 6f 73 73 69  ( rid==0 ) fossi
ea30: 6c 5f 72 65 64 69 72 65 63 74 5f 68 6f 6d 65 28  l_redirect_home(
ea40: 29 3b 0a 20 20 69 66 28 20 67 2e 70 65 72 6d 2e  );.  if( g.perm.
ea50: 41 64 6d 69 6e 20 29 7b 0a 20 20 20 20 63 6f 6e  Admin ){.    con
ea60: 73 74 20 63 68 61 72 20 2a 7a 55 75 69 64 20 3d  st char *zUuid =
ea70: 20 64 62 5f 74 65 78 74 28 22 22 2c 20 22 53 45   db_text("", "SE
ea80: 4c 45 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62  LECT uuid FROM b
ea90: 6c 6f 62 20 57 48 45 52 45 20 72 69 64 3d 25 64  lob WHERE rid=%d
eaa0: 22 2c 20 72 69 64 29 3b 0a 20 20 20 20 69 66 28  ", rid);.    if(
eab0: 20 64 62 5f 65 78 69 73 74 73 28 22 53 45 4c 45   db_exists("SELE
eac0: 43 54 20 31 20 46 52 4f 4d 20 73 68 75 6e 20 57  CT 1 FROM shun W
ead0: 48 45 52 45 20 75 75 69 64 3d 25 51 22 2c 20 7a  HERE uuid=%Q", z
eae0: 55 75 69 64 29 20 29 7b 0a 20 20 20 20 20 20 73  Uuid) ){.      s
eaf0: 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65  tyle_submenu_ele
eb00: 6d 65 6e 74 28 22 55 6e 73 68 75 6e 22 2c 20 22  ment("Unshun", "
eb10: 25 73 2f 73 68 75 6e 3f 61 63 63 65 70 74 3d 25  %s/shun?accept=%
eb20: 73 26 73 75 62 3d 31 23 64 65 6c 73 68 75 6e 22  s&sub=1#delshun"
eb30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 2e  ,.            g.
eb40: 7a 54 6f 70 2c 20 7a 55 75 69 64 29 3b 0a 20 20  zTop, zUuid);.  
eb50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
eb60: 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65  tyle_submenu_ele
eb70: 6d 65 6e 74 28 22 53 68 75 6e 22 2c 20 22 25 73  ment("Shun", "%s
eb80: 2f 73 68 75 6e 3f 73 68 75 6e 3d 25 73 23 61 64  /shun?shun=%s#ad
eb90: 64 73 68 75 6e 22 2c 20 67 2e 7a 54 6f 70 2c 20  dshun", g.zTop, 
eba0: 7a 55 75 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20  zUuid);.    }.  
ebb0: 7d 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72  }.  style_header
ebc0: 28 22 48 65 78 20 41 72 74 69 66 61 63 74 20 43  ("Hex Artifact C
ebd0: 6f 6e 74 65 6e 74 22 29 3b 0a 20 20 7a 55 75 69  ontent");.  zUui
ebe0: 64 20 3d 20 64 62 5f 74 65 78 74 28 22 3f 22 2c  d = db_text("?",
ebf0: 22 53 45 4c 45 43 54 20 75 75 69 64 20 46 52 4f  "SELECT uuid FRO
ec00: 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69 64  M blob WHERE rid
ec10: 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 69 66  =%d", rid);.  if
ec20: 28 20 67 2e 70 65 72 6d 2e 53 65 74 75 70 20 29  ( g.perm.Setup )
ec30: 7b 0a 20 20 20 20 40 20 3c 68 32 3e 41 72 74 69  {.    @ <h2>Arti
ec40: 66 61 63 74 20 25 73 28 7a 55 75 69 64 29 20 28  fact %s(zUuid) (
ec50: 25 64 28 72 69 64 29 29 3a 3c 2f 68 32 3e 0a 20  %d(rid)):</h2>. 
ec60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 40 20 3c 68   }else{.    @ <h
ec70: 32 3e 41 72 74 69 66 61 63 74 20 25 73 28 7a 55  2>Artifact %s(zU
ec80: 75 69 64 29 3a 3c 2f 68 32 3e 0a 20 20 7d 0a 20  uid):</h2>.  }. 
ec90: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 64 6f 77 6e   blob_zero(&down
eca0: 6c 6f 61 64 4e 61 6d 65 29 3b 0a 20 20 69 66 28  loadName);.  if(
ecb0: 20 50 28 22 76 65 72 62 6f 73 65 22 29 21 3d 30   P("verbose")!=0
ecc0: 20 29 20 6f 62 6a 64 65 73 63 46 6c 61 67 73 20   ) objdescFlags 
ecd0: 7c 3d 20 4f 42 4a 44 45 53 43 5f 44 45 54 41 49  |= OBJDESC_DETAI
ece0: 4c 3b 0a 20 20 6f 62 6a 65 63 74 5f 64 65 73 63  L;.  object_desc
ecf0: 72 69 70 74 69 6f 6e 28 72 69 64 2c 20 6f 62 6a  ription(rid, obj
ed00: 64 65 73 63 46 6c 61 67 73 2c 20 26 64 6f 77 6e  descFlags, &down
ed10: 6c 6f 61 64 4e 61 6d 65 29 3b 0a 20 20 73 74 79  loadName);.  sty
ed20: 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65  le_submenu_eleme
ed30: 6e 74 28 22 44 6f 77 6e 6c 6f 61 64 22 2c 20 22  nt("Download", "
ed40: 25 73 2f 72 61 77 2f 25 54 3f 6e 61 6d 65 3d 25  %s/raw/%T?name=%
ed50: 73 22 2c 0a 20 20 20 20 20 20 20 20 67 2e 7a 54  s",.        g.zT
ed60: 6f 70 2c 20 62 6c 6f 62 5f 73 74 72 28 26 64 6f  op, blob_str(&do
ed70: 77 6e 6c 6f 61 64 4e 61 6d 65 29 2c 20 7a 55 75  wnloadName), zUu
ed80: 69 64 29 3b 0a 20 20 40 20 3c 68 72 20 2f 3e 0a  id);.  @ <hr />.
ed90: 20 20 63 6f 6e 74 65 6e 74 5f 67 65 74 28 72 69    content_get(ri
eda0: 64 2c 20 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20  d, &content);.  
edb0: 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70  @ <blockquote><p
edc0: 72 65 3e 0a 20 20 68 65 78 64 75 6d 70 28 26 63  re>.  hexdump(&c
edd0: 6f 6e 74 65 6e 74 29 3b 0a 20 20 40 20 3c 2f 70  ontent);.  @ </p
ede0: 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e  re></blockquote>
edf0: 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28  .  style_footer(
ee00: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b  );.}../*.** Look
ee10: 20 66 6f 72 20 22 63 69 22 20 61 6e 64 20 22 66   for "ci" and "f
ee20: 69 6c 65 6e 61 6d 65 22 20 71 75 65 72 79 20 70  ilename" query p
ee30: 61 72 61 6d 65 74 65 72 73 2e 20 20 49 66 20 66  arameters.  If f
ee40: 6f 75 6e 64 2c 20 74 72 79 20 74 6f 0a 2a 2a 20  ound, try to.** 
ee50: 75 73 65 20 74 68 65 6d 20 74 6f 20 65 78 74 72  use them to extr
ee60: 61 63 74 20 74 68 65 20 72 65 63 6f 72 64 20 49  act the record I
ee70: 44 20 6f 66 20 61 6e 20 61 72 74 69 66 61 63 74  D of an artifact
ee80: 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 2a   for the file..*
ee90: 2a 0a 2a 2a 20 41 6c 73 6f 20 6c 6f 6f 6b 20 66  *.** Also look f
eea0: 6f 72 20 22 66 6e 22 20 61 73 20 61 6e 20 61 6c  or "fn" as an al
eeb0: 69 61 73 20 66 6f 72 20 22 66 69 6c 65 6e 61 6d  ias for "filenam
eec0: 65 22 2e 20 20 49 66 20 65 69 74 68 65 72 20 22  e".  If either "
eed0: 66 69 6c 65 6e 61 6d 65 22 0a 2a 2a 20 6f 72 20  filename".** or 
eee0: 22 66 6e 22 20 69 73 20 70 72 65 73 65 6e 74 20  "fn" is present 
eef0: 62 75 74 20 22 63 69 22 20 69 73 20 6d 69 73 73  but "ci" is miss
ef00: 69 6e 67 2c 20 75 73 65 20 22 74 69 70 22 20 61  ing, use "tip" a
ef10: 73 20 61 20 64 65 66 61 75 6c 74 20 76 61 6c 75  s a default valu
ef20: 65 0a 2a 2a 20 66 6f 72 20 22 63 69 22 2e 0a 2a  e.** for "ci"..*
ef30: 2a 0a 2a 2a 20 49 66 20 7a 4e 61 6d 65 50 61 72  *.** If zNamePar
ef40: 61 6d 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  am is not NULL, 
ef50: 74 68 69 73 20 75 73 65 20 74 68 61 74 20 70 61  this use that pa
ef60: 72 61 6d 65 74 65 72 20 61 73 20 74 68 65 20 66  rameter as the f
ef70: 69 6c 65 6e 61 6d 65 0a 2a 2a 20 72 61 74 68 65  ilename.** rathe
ef80: 72 20 74 68 61 6e 20 22 66 6e 22 20 6f 72 20 22  r than "fn" or "
ef90: 66 69 6c 65 6e 61 6d 65 22 2e 0a 2a 2a 0a 2a 2a  filename"..**.**
efa0: 20 49 66 20 70 55 72 6c 20 69 73 20 6e 6f 74 20   If pUrl is not 
efb0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 72 65 63 6f 72  NULL, then recor
efc0: 64 20 74 68 65 20 22 63 69 22 20 61 6e 64 20 22  d the "ci" and "
efd0: 66 69 6c 65 6e 61 6d 65 22 20 76 61 6c 75 65 73  filename" values
efe0: 20 69 6e 0a 2a 2a 20 70 55 72 6c 2e 0a 2a 2a 0a   in.** pUrl..**.
eff0: 2a 2a 20 41 74 20 6c 65 61 73 74 20 6f 6e 65 20  ** At least one 
f000: 6f 66 20 70 55 72 6c 20 6f 72 20 7a 4e 61 6d 65  of pUrl or zName
f010: 50 61 72 61 6d 20 6d 75 73 74 20 62 65 20 4e 55  Param must be NU
f020: 4c 4c 2e 0a 2a 2f 0a 69 6e 74 20 61 72 74 69 66  LL..*/.int artif
f030: 61 63 74 5f 66 72 6f 6d 5f 63 69 5f 61 6e 64 5f  act_from_ci_and_
f040: 66 69 6c 65 6e 61 6d 65 28 48 51 75 65 72 79 20  filename(HQuery 
f050: 2a 70 55 72 6c 2c 20 63 6f 6e 73 74 20 63 68 61  *pUrl, const cha
f060: 72 20 2a 7a 4e 61 6d 65 50 61 72 61 6d 29 7b 0a  r *zNameParam){.
f070: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
f080: 69 6c 65 6e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74  ilename;.  const
f090: 20 63 68 61 72 20 2a 7a 43 49 3b 0a 20 20 69 6e   char *zCI;.  in
f0a0: 74 20 63 69 72 69 64 3b 0a 20 20 4d 61 6e 69 66  t cirid;.  Manif
f0b0: 65 73 74 20 2a 70 4d 61 6e 69 66 65 73 74 3b 0a  est *pManifest;.
f0c0: 20 20 4d 61 6e 69 66 65 73 74 46 69 6c 65 20 2a    ManifestFile *
f0d0: 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 7a 4e  pFile;..  if( zN
f0e0: 61 6d 65 50 61 72 61 6d 20 29 7b 0a 20 20 20 20  ameParam ){.    
f0f0: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 50 28 7a 4e  zFilename = P(zN
f100: 61 6d 65 50 61 72 61 6d 29 3b 0a 20 20 7d 65 6c  ameParam);.  }el
f110: 73 65 7b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  se{.    zFilenam
f120: 65 20 3d 20 50 28 22 66 69 6c 65 6e 61 6d 65 22  e = P("filename"
f130: 29 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65  );.    if( zFile
f140: 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  name==0 ){.     
f150: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 50 28 22   zFilename = P("
f160: 66 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  fn");.    }.  }.
f170: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
f180: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
f190: 20 20 7a 43 49 20 3d 20 50 28 22 63 69 22 29 3b    zCI = P("ci");
f1a0: 0a 20 20 63 69 72 69 64 20 3d 20 6e 61 6d 65 5f  .  cirid = name_
f1b0: 74 6f 5f 74 79 70 65 64 5f 72 69 64 28 7a 43 49  to_typed_rid(zCI
f1c0: 20 3f 20 7a 43 49 20 3a 20 22 74 69 70 22 2c 20   ? zCI : "tip", 
f1d0: 22 63 69 22 29 3b 0a 20 20 69 66 28 20 63 69 72  "ci");.  if( cir
f1e0: 69 64 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30  id<=0 ) return 0
f1f0: 3b 0a 20 20 70 4d 61 6e 69 66 65 73 74 20 3d 20  ;.  pManifest = 
f200: 6d 61 6e 69 66 65 73 74 5f 67 65 74 28 63 69 72  manifest_get(cir
f210: 69 64 2c 20 43 46 54 59 50 45 5f 4d 41 4e 49 46  id, CFTYPE_MANIF
f220: 45 53 54 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  EST, 0);.  if( p
f230: 4d 61 6e 69 66 65 73 74 3d 3d 30 20 29 20 72 65  Manifest==0 ) re
f240: 74 75 72 6e 20 30 3b 0a 20 20 6d 61 6e 69 66 65  turn 0;.  manife
f250: 73 74 5f 66 69 6c 65 5f 72 65 77 69 6e 64 28 70  st_file_rewind(p
f260: 4d 61 6e 69 66 65 73 74 29 3b 0a 20 20 77 68 69  Manifest);.  whi
f270: 6c 65 28 20 28 70 46 69 6c 65 20 3d 20 6d 61 6e  le( (pFile = man
f280: 69 66 65 73 74 5f 66 69 6c 65 5f 6e 65 78 74 28  ifest_file_next(
f290: 70 4d 61 6e 69 66 65 73 74 2c 30 29 29 21 3d 30  pManifest,0))!=0
f2a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 66 6f 73 73   ){.    if( foss
f2b0: 69 6c 5f 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  il_strcmp(zFilen
f2c0: 61 6d 65 2c 20 70 46 69 6c 65 2d 3e 7a 4e 61 6d  ame, pFile->zNam
f2d0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e)==0 ){.      i
f2e0: 6e 74 20 72 69 64 20 3d 20 64 62 5f 69 6e 74 28  nt rid = db_int(
f2f0: 30 2c 20 22 53 45 4c 45 43 54 20 72 69 64 20 46  0, "SELECT rid F
f300: 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 75  ROM blob WHERE u
f310: 75 69 64 3d 25 51 22 2c 20 70 46 69 6c 65 2d 3e  uid=%Q", pFile->
f320: 7a 55 75 69 64 29 3b 0a 20 20 20 20 20 20 6d 61  zUuid);.      ma
f330: 6e 69 66 65 73 74 5f 64 65 73 74 72 6f 79 28 70  nifest_destroy(p
f340: 4d 61 6e 69 66 65 73 74 29 3b 0a 20 20 20 20 20  Manifest);.     
f350: 20 69 66 28 20 70 55 72 6c 20 29 7b 0a 20 20 20   if( pUrl ){.   
f360: 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61       assert( zNa
f370: 6d 65 50 61 72 61 6d 3d 3d 30 20 29 3b 0a 20 20  meParam==0 );.  
f380: 20 20 20 20 20 20 75 72 6c 5f 61 64 64 5f 70 61        url_add_pa
f390: 72 61 6d 65 74 65 72 28 70 55 72 6c 2c 20 22 66  rameter(pUrl, "f
f3a0: 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  n", zFilename);.
f3b0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 43 49 20          if( zCI 
f3c0: 29 20 75 72 6c 5f 61 64 64 5f 70 61 72 61 6d 65  ) url_add_parame
f3d0: 74 65 72 28 70 55 72 6c 2c 20 22 63 69 22 2c 20  ter(pUrl, "ci", 
f3e0: 7a 43 49 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  zCI);.      }.  
f3f0: 20 20 20 20 72 65 74 75 72 6e 20 72 69 64 3b 0a      return rid;.
f400: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6d 61 6e 69      }.  }.  mani
f410: 66 65 73 74 5f 64 65 73 74 72 6f 79 28 70 4d 61  fest_destroy(pMa
f420: 6e 69 66 65 73 74 29 3b 0a 20 20 72 65 74 75 72  nifest);.  retur
f430: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
f440: 65 20 22 7a 22 20 61 72 67 75 6d 65 6e 74 20 69  e "z" argument i
f450: 73 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  s a string that 
f460: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 78  contains the tex
f470: 74 20 6f 66 20 61 20 73 6f 75 72 63 65 20 63 6f  t of a source co
f480: 64 65 0a 2a 2a 20 66 69 6c 65 2e 20 20 54 68 69  de.** file.  Thi
f490: 73 20 72 6f 75 74 69 6e 65 20 61 70 70 65 6e 64  s routine append
f4a0: 73 20 74 68 61 74 20 74 65 78 74 20 74 6f 20 74  s that text to t
f4b0: 68 65 20 48 54 54 50 20 72 65 70 6c 79 20 77 69  he HTTP reply wi
f4c0: 74 68 20 6c 69 6e 65 20 6e 75 6d 62 65 72 69 6e  th line numberin
f4d0: 67 2e 0a 2a 2a 0a 2a 2a 20 7a 4c 6e 20 69 73 20  g..**.** zLn is 
f4e0: 74 68 65 20 3f 6c 6e 3d 20 70 61 72 61 6d 65 74  the ?ln= paramet
f4f0: 65 72 20 66 6f 72 20 74 68 65 20 48 54 54 50 20  er for the HTTP 
f500: 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 72 65  query.  If there
f510: 20 69 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2c   is an argument,
f520: 0a 2a 2a 20 74 68 65 6e 20 68 69 67 68 6c 69 67  .** then highlig
f530: 68 74 20 74 68 61 74 20 6c 69 6e 65 20 6e 75 6d  ht that line num
f540: 62 65 72 20 61 6e 64 20 73 63 72 6f 6c 6c 20 74  ber and scroll t
f550: 6f 20 69 74 20 6f 6e 63 65 20 74 68 65 20 70 61  o it once the pa
f560: 67 65 20 6c 6f 61 64 73 2e 0a 2a 2a 20 49 66 20  ge loads..** If 
f570: 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6c 69  there are two li
f580: 6e 65 20 6e 75 6d 62 65 72 73 2c 20 68 69 67 68  ne numbers, high
f590: 6c 69 67 68 74 20 74 68 65 20 72 61 6e 67 65 20  light the range 
f5a0: 6f 66 20 6c 69 6e 65 73 2e 0a 2a 2a 20 4d 75 6c  of lines..** Mul
f5b0: 74 69 70 6c 65 20 72 61 6e 67 65 73 20 63 61 6e  tiple ranges can
f5c0: 20 62 65 20 68 69 67 68 6c 69 67 68 65 64 20 62   be highlighed b
f5d0: 79 20 61 64 64 69 6e 67 20 61 64 64 69 74 69 6f  y adding additio
f5e0: 6e 61 6c 20 6c 69 6e 65 20 6e 75 6d 62 65 72 73  nal line numbers
f5f0: 0a 2a 2a 20 73 65 70 61 72 61 74 65 64 20 62 79  .** separated by
f600: 20 61 20 6e 6f 6e 2d 64 69 67 69 74 20 63 68 61   a non-digit cha
f610: 72 61 63 74 65 72 20 28 61 6c 73 6f 20 6e 6f 74  racter (also not
f620: 20 6f 6e 65 20 6f 66 20 5b 2d 2c 2e 5d 29 2e 0a   one of [-,.])..
f630: 2a 2f 0a 76 6f 69 64 20 6f 75 74 70 75 74 5f 74  */.void output_t
f640: 65 78 74 5f 77 69 74 68 5f 6c 69 6e 65 5f 6e 75  ext_with_line_nu
f650: 6d 62 65 72 73 28 0a 20 20 63 6f 6e 73 74 20 63  mbers(.  const c
f660: 68 61 72 20 2a 7a 2c 0a 20 20 63 6f 6e 73 74 20  har *z,.  const 
f670: 63 68 61 72 20 2a 7a 4c 6e 0a 29 7b 0a 20 20 69  char *zLn.){.  i
f680: 6e 74 20 69 53 74 61 72 74 2c 20 69 45 6e 64 3b  nt iStart, iEnd;
f690: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 61 6e 64      /* Start and
f6a0: 20 65 6e 64 20 6f 66 20 72 65 67 69 6f 6e 20 74   end of region t
f6b0: 6f 20 68 69 67 68 6c 69 67 68 74 20 2a 2f 0a 20  o highlight */. 
f6c0: 20 69 6e 74 20 6e 20 3d 20 30 3b 20 20 20 20 20   int n = 0;     
f6d0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
f6e0: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   line number */.
f6f0: 20 20 69 6e 74 20 69 20 3d 20 30 3b 20 20 20 20    int i = 0;    
f700: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 69         /* Loop i
f710: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 54  ndex */.  int iT
f720: 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  op = 0;        /
f730: 2a 20 53 63 72 6f 6c 6c 20 73 6f 20 74 68 61 74  * Scroll so that
f740: 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6f 6e   this line is on
f750: 20 74 6f 70 20 6f 66 20 73 63 72 65 65 6e 2e 20   top of screen. 
f760: 2a 2f 0a 20 20 53 74 6d 74 20 71 3b 0a 0a 20 20  */.  Stmt q;..  
f770: 69 53 74 61 72 74 20 3d 20 69 45 6e 64 20 3d 20  iStart = iEnd = 
f780: 61 74 6f 69 28 7a 4c 6e 29 3b 0a 20 20 64 62 5f  atoi(zLn);.  db_
f790: 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20  multi_exec(.    
f7a0: 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42  "CREATE TEMP TAB
f7b0: 4c 45 20 6c 6e 6f 73 28 69 53 74 61 72 74 20 49  LE lnos(iStart I
f7c0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
f7d0: 45 59 2c 20 69 45 6e 64 20 49 4e 54 45 47 45 52  EY, iEnd INTEGER
f7e0: 29 22 29 3b 0a 20 20 69 66 28 20 69 53 74 61 72  )");.  if( iStar
f7f0: 74 3e 30 20 29 7b 0a 20 20 20 20 64 6f 7b 0a 20  t>0 ){.    do{. 
f800: 20 20 20 20 20 77 68 69 6c 65 28 20 66 6f 73 73       while( foss
f810: 69 6c 5f 69 73 64 69 67 69 74 28 7a 4c 6e 5b 69  il_isdigit(zLn[i
f820: 5d 29 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20  ]) ) i++;.      
f830: 69 66 28 20 7a 4c 6e 5b 69 5d 3d 3d 27 2c 27 20  if( zLn[i]==',' 
f840: 7c 7c 20 7a 4c 6e 5b 69 5d 3d 3d 27 2d 27 20 7c  || zLn[i]=='-' |
f850: 7c 20 7a 4c 6e 5b 69 5d 3d 3d 27 2e 27 20 29 7b  | zLn[i]=='.' ){
f860: 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
f870: 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 6e        while( zLn
f880: 5b 69 5d 3d 3d 27 2e 27 20 29 7b 20 69 2b 2b 3b  [i]=='.' ){ i++;
f890: 20 7d 0a 20 20 20 20 20 20 20 20 69 45 6e 64 20   }.        iEnd 
f8a0: 3d 20 61 74 6f 69 28 26 7a 4c 6e 5b 69 5d 29 3b  = atoi(&zLn[i]);
f8b0: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
f8c0: 66 6f 73 73 69 6c 5f 69 73 64 69 67 69 74 28 7a  fossil_isdigit(z
f8d0: 4c 6e 5b 69 5d 29 20 29 20 69 2b 2b 3b 0a 20 20  Ln[i]) ) i++;.  
f8e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
f8f0: 65 28 20 66 6f 73 73 69 6c 5f 69 73 64 69 67 69  e( fossil_isdigi
f900: 74 28 7a 4c 6e 5b 69 5d 29 20 29 20 69 2b 2b 3b  t(zLn[i]) ) i++;
f910: 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64 3c  .      if( iEnd<
f920: 69 53 74 61 72 74 20 29 20 69 45 6e 64 20 3d 20  iStart ) iEnd = 
f930: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 64 62  iStart;.      db
f940: 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20  _multi_exec(.   
f950: 20 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20       "INSERT OR 
f960: 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 6c 6e 6f  REPLACE INTO lno
f970: 73 20 56 41 4c 55 45 53 28 25 64 2c 25 64 29 22  s VALUES(%d,%d)"
f980: 2c 20 69 53 74 61 72 74 2c 20 69 45 6e 64 0a 20  , iStart, iEnd. 
f990: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 53       );.      iS
f9a0: 74 61 72 74 20 3d 20 69 45 6e 64 20 3d 20 61 74  tart = iEnd = at
f9b0: 6f 69 28 26 7a 4c 6e 5b 69 2b 2b 5d 29 3b 0a 20  oi(&zLn[i++]);. 
f9c0: 20 20 20 7d 77 68 69 6c 65 28 20 7a 4c 6e 5b 69     }while( zLn[i
f9d0: 5d 20 26 26 20 69 53 74 61 72 74 20 26 26 20 69  ] && iStart && i
f9e0: 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 64 62 5f  End );.  }.  db_
f9f0: 70 72 65 70 61 72 65 28 26 71 2c 20 22 53 45 4c  prepare(&q, "SEL
fa00: 45 43 54 20 6d 69 6e 28 69 53 74 61 72 74 29 2c  ECT min(iStart),
fa10: 20 6d 61 78 28 69 45 6e 64 29 20 46 52 4f 4d 20   max(iEnd) FROM 
fa20: 6c 6e 6f 73 22 29 3b 0a 20 20 69 66 28 20 64 62  lnos");.  if( db
fa30: 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54  _step(&q)==SQLIT
fa40: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 53 74  E_ROW ){.    iSt
fa50: 61 72 74 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  art = db_column_
fa60: 69 6e 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20  int(&q, 0);.    
fa70: 69 45 6e 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  iEnd = db_column
fa80: 5f 69 6e 74 28 26 71 2c 20 31 29 3b 0a 20 20 20  _int(&q, 1);.   
fa90: 20 69 54 6f 70 20 3d 20 69 53 74 61 72 74 20 2d   iTop = iStart -
faa0: 20 31 35 20 2b 20 28 69 45 6e 64 2d 69 53 74 61   15 + (iEnd-iSta
fab0: 72 74 29 2f 34 3b 0a 20 20 20 20 69 66 28 20 69  rt)/4;.    if( i
fac0: 54 6f 70 3e 69 53 74 61 72 74 20 2d 20 32 20 29  Top>iStart - 2 )
fad0: 20 69 54 6f 70 20 3d 20 69 53 74 61 72 74 2d 32   iTop = iStart-2
fae0: 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c  ;.  }.  db_final
faf0: 69 7a 65 28 26 71 29 3b 0a 20 20 40 20 3c 70 72  ize(&q);.  @ <pr
fb00: 65 3e 0a 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d  e>.  while( z[0]
fb10: 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 20   ){.    n++;.   
fb20: 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 0a   db_prepare(&q,.
fb30: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6d 69        "SELECT mi
fb40: 6e 28 69 53 74 61 72 74 29 2c 20 6d 61 78 28 69  n(iStart), max(i
fb50: 45 6e 64 29 20 46 52 4f 4d 20 6c 6e 6f 73 22 0a  End) FROM lnos".
fb60: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 69 53        " WHERE iS
fb70: 74 61 72 74 20 3c 3d 20 25 64 20 41 4e 44 20 69  tart <= %d AND i
fb80: 45 6e 64 20 3e 3d 20 25 64 22 2c 20 6e 2c 20 6e  End >= %d", n, n
fb90: 29 3b 0a 20 20 20 20 69 66 28 20 64 62 5f 73 74  );.    if( db_st
fba0: 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52  ep(&q)==SQLITE_R
fbb0: 4f 57 20 29 7b 0a 20 20 20 20 20 20 69 53 74 61  OW ){.      iSta
fbc0: 72 74 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69  rt = db_column_i
fbd0: 6e 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 20  nt(&q, 0);.     
fbe0: 20 69 45 6e 64 20 3d 20 64 62 5f 63 6f 6c 75 6d   iEnd = db_colum
fbf0: 6e 5f 69 6e 74 28 26 71 2c 20 31 29 3b 0a 20 20  n_int(&q, 1);.  
fc00: 20 20 7d 0a 20 20 20 20 64 62 5f 66 69 6e 61 6c    }.    db_final
fc10: 69 7a 65 28 26 71 29 3b 0a 20 20 20 20 66 6f 72  ize(&q);.    for
fc20: 28 69 3d 30 3b 20 7a 5b 69 5d 20 26 26 20 7a 5b  (i=0; z[i] && z[
fc30: 69 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d  i]!='\n'; i++){}
fc40: 0a 20 20 20 20 69 66 28 20 6e 3d 3d 69 54 6f 70  .    if( n==iTop
fc50: 20 29 20 63 67 69 5f 61 70 70 65 6e 64 5f 63 6f   ) cgi_append_co
fc60: 6e 74 65 6e 74 28 22 3c 73 70 61 6e 20 69 64 3d  ntent("<span id=
fc70: 5c 22 73 63 72 6f 6c 6c 54 6f 4d 65 5c 22 3e 22  \"scrollToMe\">"
fc80: 2c 20 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 6e  , -1);.    if( n
fc90: 3d 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ==iStart ){.    
fca0: 20 20 63 67 69 5f 61 70 70 65 6e 64 5f 63 6f 6e    cgi_append_con
fcb0: 74 65 6e 74 28 22 3c 64 69 76 20 63 6c 61 73 73  tent("<div class
fcc0: 3d 5c 22 73 65 6c 65 63 74 65 64 54 65 78 74 5c  =\"selectedText\
fcd0: 22 3e 22 2c 2d 31 29 3b 0a 20 20 20 20 7d 0a 20  ">",-1);.    }. 
fce0: 20 20 20 63 67 69 5f 70 72 69 6e 74 66 28 22 25     cgi_printf("%
fcf0: 36 64 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20 69  6d  ", n);.    i
fd00: 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( i>0 ){.      
fd10: 63 68 61 72 20 2a 7a 48 74 6d 6c 20 3d 20 68 74  char *zHtml = ht
fd20: 6d 6c 69 7a 65 28 7a 2c 20 69 29 3b 0a 20 20 20  mlize(z, i);.   
fd30: 20 20 20 63 67 69 5f 61 70 70 65 6e 64 5f 63 6f     cgi_append_co
fd40: 6e 74 65 6e 74 28 7a 48 74 6d 6c 2c 20 2d 31 29  ntent(zHtml, -1)
fd50: 3b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66  ;.      fossil_f
fd60: 72 65 65 28 7a 48 74 6d 6c 29 3b 0a 20 20 20 20  ree(zHtml);.    
fd70: 7d 0a 20 20 20 20 69 66 28 20 6e 3d 3d 69 54 6f  }.    if( n==iTo
fd80: 70 20 29 20 63 67 69 5f 61 70 70 65 6e 64 5f 63  p ) cgi_append_c
fd90: 6f 6e 74 65 6e 74 28 22 3c 2f 73 70 61 6e 3e 22  ontent("</span>"
fda0: 2c 20 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 6e  , -1);.    if( n
fdb0: 3d 3d 69 45 6e 64 20 29 20 63 67 69 5f 61 70 70  ==iEnd ) cgi_app
fdc0: 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 22 3c 2f 64  end_content("</d
fdd0: 69 76 3e 22 2c 20 2d 31 29 3b 0a 20 20 20 20 65  iv>", -1);.    e
fde0: 6c 73 65 20 63 67 69 5f 61 70 70 65 6e 64 5f 63  lse cgi_append_c
fdf0: 6f 6e 74 65 6e 74 28 22 5c 6e 22 2c 20 31 29 3b  ontent("\n", 1);
fe00: 0a 20 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20  .    z += i;.   
fe10: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 5c 6e 27 20   if( z[0]=='\n' 
fe20: 29 20 7a 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  ) z++;.  }.  if(
fe30: 20 6e 3c 69 45 6e 64 20 29 20 63 67 69 5f 70 72   n<iEnd ) cgi_pr
fe40: 69 6e 74 66 28 22 3c 2f 64 69 76 3e 22 29 3b 0a  intf("</div>");.
fe50: 20 20 40 20 3c 2f 70 72 65 3e 0a 20 20 69 66 28    @ </pre>.  if(
fe60: 20 64 62 5f 69 6e 74 28 30 2c 20 22 53 45 4c 45   db_int(0, "SELE
fe70: 43 54 20 45 58 49 53 54 53 28 53 45 4c 45 43 54  CT EXISTS(SELECT
fe80: 20 31 20 46 52 4f 4d 20 6c 6e 6f 73 29 22 29 20   1 FROM lnos)") 
fe90: 29 7b 0a 20 20 20 20 73 74 79 6c 65 5f 6c 6f 61  ){.    style_loa
fea0: 64 5f 6f 6e 65 5f 6a 73 5f 66 69 6c 65 28 22 73  d_one_js_file("s
feb0: 63 72 6f 6c 6c 2e 6a 73 22 29 3b 0a 20 20 7d 0a  croll.js");.  }.
fec0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47  }.../*.** WEBPAG
fed0: 45 3a 20 61 72 74 69 66 61 63 74 0a 2a 2a 20 57  E: artifact.** W
fee0: 45 42 50 41 47 45 3a 20 66 69 6c 65 0a 2a 2a 20  EBPAGE: file.** 
fef0: 57 45 42 50 41 47 45 3a 20 77 68 61 74 69 73 0a  WEBPAGE: whatis.
ff00: 2a 2a 0a 2a 2a 20 54 79 70 69 63 61 6c 20 75 73  **.** Typical us
ff10: 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2f 61  age:.**.**    /a
ff20: 72 74 69 66 61 63 74 2f 48 41 53 48 0a 2a 2a 20  rtifact/HASH.** 
ff30: 20 20 20 2f 77 68 61 74 69 73 2f 48 41 53 48 0a     /whatis/HASH.
ff40: 2a 2a 20 20 20 20 2f 66 69 6c 65 2f 4e 41 4d 45  **    /file/NAME
ff50: 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61  .**.** Additiona
ff60: 6c 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  l query paramete
ff70: 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6c 6e 20 20  rs:.**.**   ln  
ff80: 20 20 20 20 20 20 20 20 20 20 20 20 2d 20 73 68              - sh
ff90: 6f 77 20 6c 69 6e 65 20 6e 75 6d 62 65 72 73 0a  ow line numbers.
ffa0: 2a 2a 20 20 20 6c 6e 3d 4e 20 20 20 20 20 20 20  **   ln=N       
ffb0: 20 20 20 20 20 2d 20 68 69 67 68 6c 69 67 68 74       - highlight
ffc0: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 4e 0a 2a   line number N.*
ffd0: 2a 20 20 20 6c 6e 3d 4d 2d 4e 20 20 20 20 20 20  *   ln=M-N      
ffe0: 20 20 20 20 2d 20 68 69 67 68 6c 69 67 68 74 20      - highlight 
fff0: 6c 69 6e 65 73 20 4d 20 74 68 72 6f 75 67 68 20  lines M through 
10000 4e 20 69 6e 63 6c 75 73 69 76 65 0a 2a 2a 20 20  N inclusive.**  
10010 20 6c 6e 3d 4d 2d 4e 2b 59 2d 5a 20 20 20 20 20   ln=M-N+Y-Z     
10020 20 2d 20 68 69 67 68 6c 69 67 68 74 20 6c 69 6e   - highlight lin
10030 65 73 20 4d 20 74 68 72 6f 75 67 68 20 4e 20 61  es M through N a
10040 6e 64 20 59 20 74 68 72 6f 75 67 68 20 5a 20 28  nd Y through Z (
10050 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20 20 20  inclusive).**   
10060 76 65 72 62 6f 73 65 20 20 20 20 20 20 20 20 20  verbose         
10070 2d 20 73 68 6f 77 20 6d 6f 72 65 20 64 65 74 61  - show more deta
10080 69 6c 20 69 6e 20 74 68 65 20 64 65 73 63 72 69  il in the descri
10090 70 74 69 6f 6e 0a 2a 2a 20 20 20 64 6f 77 6e 6c  ption.**   downl
100a0 6f 61 64 20 20 20 20 20 20 20 20 2d 20 72 65 64  oad        - red
100b0 69 72 65 63 74 20 74 6f 20 74 68 65 20 64 6f 77  irect to the dow
100c0 6e 6c 6f 61 64 20 28 61 72 74 69 66 61 63 74 20  nload (artifact 
100d0 70 61 67 65 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20  page only).**   
100e0 6e 61 6d 65 3d 53 48 41 31 48 41 53 48 20 20 20  name=SHA1HASH   
100f0 2d 20 50 72 6f 76 69 64 65 20 74 68 65 20 53 48  - Provide the SH
10100 41 31 48 41 53 48 20 61 73 20 61 20 71 75 65 72  A1HASH as a quer
10110 79 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 20  y parameter.**  
10120 20 66 69 6c 65 6e 61 6d 65 3d 4e 41 4d 45 20 20   filename=NAME  
10130 20 2d 20 53 68 6f 77 20 69 6e 66 6f 72 6d 61 74   - Show informat
10140 69 6f 6e 20 66 6f 72 20 63 6f 6e 74 65 6e 74 20  ion for content 
10150 66 69 6c 65 20 4e 41 4d 45 0a 2a 2a 20 20 20 66  file NAME.**   f
10160 6e 3d 4e 41 4d 45 20 20 20 20 20 20 20 20 20 2d  n=NAME         -
10170 20 22 66 6e 22 20 69 73 20 73 68 6f 72 74 68 61   "fn" is shortha
10180 6e 64 20 66 6f 72 20 22 66 69 6c 65 6e 61 6d 65  nd for "filename
10190 22 0a 2a 2a 20 20 20 63 69 3d 56 45 52 53 49 4f  ".**   ci=VERSIO
101a0 4e 20 20 20 20 20 20 2d 20 54 68 65 20 73 70 65  N      - The spe
101b0 63 69 66 69 63 20 63 68 65 63 6b 2d 69 6e 20 74  cific check-in t
101c0 6f 20 75 73 65 20 66 6f 72 20 22 66 69 6c 65 6e  o use for "filen
101d0 61 6d 65 3d 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ame="..**.** The
101e0 20 2f 61 72 74 69 66 61 63 74 20 70 61 67 65 20   /artifact page 
101f0 73 68 6f 77 20 74 68 65 20 63 6f 6d 70 6c 65 74  show the complet
10200 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 66  e content of a f
10210 69 6c 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65  ile.** identifie
10220 64 20 62 79 20 48 41 53 48 20 61 73 20 70 72 65  d by HASH as pre
10230 66 6f 72 6d 61 74 74 65 64 20 74 65 78 74 2e 20  formatted text. 
10240 20 54 68 65 0a 2a 2a 20 2f 77 68 61 74 69 73 20   The.** /whatis 
10250 70 61 67 65 20 73 68 6f 77 73 20 6f 6e 6c 79 20  page shows only 
10260 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
10270 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20   the file.  The 
10280 2f 66 69 6c 65 0a 2a 2a 20 70 61 67 65 20 73 68  /file.** page sh
10290 6f 77 73 20 74 68 65 20 6d 6f 73 74 20 72 65 63  ows the most rec
102a0 65 6e 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  ent version of t
102b0 68 65 20 66 69 6c 65 20 6f 72 20 64 69 72 65 63  he file or direc
102c0 74 6f 72 79 0a 2a 2a 20 63 61 6c 6c 65 64 20 4e  tory.** called N
102d0 41 4d 45 2c 20 6f 72 20 61 20 6c 69 73 74 20 6f  AME, or a list o
102e0 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  f the top-level 
102f0 64 69 72 65 63 74 6f 72 79 20 69 66 20 4e 41 4d  directory if NAM
10300 45 20 69 73 0a 2a 2a 20 6f 6d 69 74 74 65 64 2e  E is.** omitted.
10310 0a 2a 2f 0a 76 6f 69 64 20 61 72 74 69 66 61 63  .*/.void artifac
10320 74 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20 20  t_page(void){.  
10330 69 6e 74 20 72 69 64 20 3d 20 30 3b 0a 20 20 42  int rid = 0;.  B
10340 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a 20 20 63  lob content;.  c
10350 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 69 6d 65  onst char *zMime
10360 3b 0a 20 20 42 6c 6f 62 20 64 6f 77 6e 6c 6f 61  ;.  Blob downloa
10370 64 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 72 65 6e  dName;.  int ren
10380 64 65 72 41 73 57 69 6b 69 20 3d 20 30 3b 0a 20  derAsWiki = 0;. 
10390 20 69 6e 74 20 72 65 6e 64 65 72 41 73 48 74 6d   int renderAsHtm
103a0 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 62 6a  l = 0;.  int obj
103b0 54 79 70 65 3b 0a 20 20 69 6e 74 20 61 73 54 65  Type;.  int asTe
103c0 78 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  xt;.  const char
103d0 20 2a 7a 55 75 69 64 3b 0a 20 20 75 33 32 20 6f   *zUuid;.  u32 o
103e0 62 6a 64 65 73 63 46 6c 61 67 73 20 3d 20 4f 42  bjdescFlags = OB
103f0 4a 44 45 53 43 5f 42 41 53 45 3b 0a 20 20 69 6e  JDESC_BASE;.  in
10400 74 20 64 65 73 63 4f 6e 6c 79 20 3d 20 66 6f 73  t descOnly = fos
10410 73 69 6c 5f 73 74 72 63 6d 70 28 67 2e 7a 50 61  sil_strcmp(g.zPa
10420 74 68 2c 22 77 68 61 74 69 73 22 29 3d 3d 30 3b  th,"whatis")==0;
10430 0a 20 20 69 6e 74 20 69 73 46 69 6c 65 20 3d 20  .  int isFile = 
10440 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 67 2e  fossil_strcmp(g.
10450 7a 50 61 74 68 2c 22 66 69 6c 65 22 29 3d 3d 30  zPath,"file")==0
10460 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
10470 7a 4c 6e 20 3d 20 50 28 22 6c 6e 22 29 3b 0a 20  zLn = P("ln");. 
10480 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
10490 6d 65 20 3d 20 50 28 22 6e 61 6d 65 22 29 3b 0a  me = P("name");.
104a0 20 20 48 51 75 65 72 79 20 75 72 6c 3b 0a 0a 20    HQuery url;.. 
104b0 20 75 72 6c 5f 69 6e 69 74 69 61 6c 69 7a 65 28   url_initialize(
104c0 26 75 72 6c 2c 20 67 2e 7a 50 61 74 68 29 3b 0a  &url, g.zPath);.
104d0 20 20 72 69 64 20 3d 20 61 72 74 69 66 61 63 74    rid = artifact
104e0 5f 66 72 6f 6d 5f 63 69 5f 61 6e 64 5f 66 69 6c  _from_ci_and_fil
104f0 65 6e 61 6d 65 28 26 75 72 6c 2c 20 30 29 3b 0a  ename(&url, 0);.
10500 20 20 69 66 28 20 72 69 64 3d 3d 30 20 29 7b 0a    if( rid==0 ){.
10510 20 20 20 20 75 72 6c 5f 61 64 64 5f 70 61 72 61      url_add_para
10520 6d 65 74 65 72 28 26 75 72 6c 2c 20 22 6e 61 6d  meter(&url, "nam
10530 65 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  e", zName);.    
10540 69 66 28 20 69 73 46 69 6c 65 20 29 7b 0a 20 20  if( isFile ){.  
10550 20 20 20 20 2f 2a 20 44 6f 20 61 20 74 6f 70 2d      /* Do a top-
10560 6c 65 76 65 6c 20 64 69 72 65 63 74 6f 72 79 20  level directory 
10570 6c 69 73 74 69 6e 67 20 69 6e 20 2f 66 69 6c 65  listing in /file
10580 20 6d 6f 64 65 20 69 66 20 6e 6f 20 61 72 67 75   mode if no argu
10590 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 73 70  ment.      ** sp
105a0 65 63 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 20  ecified */.     
105b0 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c   if( zName==0 ||
105c0 20 7a 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 0a   zName[0]==0 ){.
105d0 20 20 20 20 20 20 20 20 69 66 28 20 50 28 22 63          if( P("c
105e0 69 22 29 3d 3d 30 20 29 20 63 67 69 5f 73 65 74  i")==0 ) cgi_set
105f0 5f 71 75 65 72 79 5f 70 61 72 61 6d 65 74 65 72  _query_parameter
10600 28 22 63 69 22 2c 22 74 69 70 22 29 3b 0a 20 20  ("ci","tip");.  
10610 20 20 20 20 20 20 70 61 67 65 5f 74 72 65 65 28        page_tree(
10620 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
10630 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
10640 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 20 73   /* Look for a s
10650 69 6e 67 6c 65 20 66 69 6c 65 20 77 69 74 68 20  ingle file with 
10660 74 68 65 20 67 69 76 65 6e 20 6e 61 6d 65 20 2a  the given name *
10670 2f 0a 20 20 20 20 20 20 72 69 64 20 3d 20 64 62  /.      rid = db
10680 5f 69 6e 74 28 30 2c 0a 20 20 20 20 20 20 20 20  _int(0,.        
10690 20 22 53 45 4c 45 43 54 20 66 69 64 20 46 52 4f   "SELECT fid FRO
106a0 4d 20 66 69 6c 65 6e 61 6d 65 2c 20 6d 6c 69 6e  M filename, mlin
106b0 6b 2c 20 65 76 65 6e 74 22 0a 20 20 20 20 20 20  k, event".      
106c0 20 20 20 22 20 57 48 45 52 45 20 6e 61 6d 65 3d     " WHERE name=
106d0 25 51 22 0a 20 20 20 20 20 20 20 20 20 22 20 20  %Q".         "  
106e0 20 41 4e 44 20 6d 6c 69 6e 6b 2e 66 6e 69 64 3d   AND mlink.fnid=
106f0 66 69 6c 65 6e 61 6d 65 2e 66 6e 69 64 22 0a 20  filename.fnid". 
10700 20 20 20 20 20 20 20 20 22 20 20 20 41 4e 44 20          "   AND 
10710 65 76 65 6e 74 2e 6f 62 6a 69 64 3d 6d 6c 69 6e  event.objid=mlin
10720 6b 2e 6d 69 64 22 0a 20 20 20 20 20 20 20 20 20  k.mid".         
10730 22 20 4f 52 44 45 52 20 42 59 20 65 76 65 6e 74  " ORDER BY event
10740 2e 6d 74 69 6d 65 20 44 45 53 43 20 4c 49 4d 49  .mtime DESC LIMI
10750 54 20 31 22 2c 0a 20 20 20 20 20 20 20 20 20 7a  T 1",.         z
10760 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  Name.      );.  
10770 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 66 69 6c      /* If no fil
10780 65 20 63 61 6c 6c 65 64 20 4e 41 4d 45 20 65 78  e called NAME ex
10790 69 73 74 73 2c 20 69 6e 73 74 65 61 64 20 6c 6f  ists, instead lo
107a0 6f 6b 20 66 6f 72 20 61 20 64 69 72 65 63 74 6f  ok for a directo
107b0 72 79 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68  ry.      ** with
107c0 20 74 68 61 74 20 6e 61 6d 65 2c 20 61 6e 64 20   that name, and 
107d0 64 6f 20 61 20 64 69 72 65 63 74 6f 72 79 20 6c  do a directory l
107e0 69 73 74 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  isting */.      
107f0 69 66 28 20 72 69 64 3d 3d 30 20 29 7b 0a 20 20  if( rid==0 ){.  
10800 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 20        int nName 
10810 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4e  = (int)strlen(zN
10820 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
10830 28 20 6e 4e 61 6d 65 20 26 26 20 7a 4e 61 6d 65  ( nName && zName
10840 5b 6e 4e 61 6d 65 2d 31 5d 3d 3d 27 2f 27 20 29  [nName-1]=='/' )
10850 20 6e 4e 61 6d 65 2d 2d 3b 0a 20 20 20 20 20 20   nName--;.      
10860 20 20 69 66 28 20 64 62 5f 65 78 69 73 74 73 28    if( db_exists(
10870 0a 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c  .           "SEL
10880 45 43 54 20 31 20 46 52 4f 4d 20 66 69 6c 65 6e  ECT 1 FROM filen
10890 61 6d 65 22 0a 20 20 20 20 20 20 20 20 20 20 20  ame".           
108a0 22 20 57 48 45 52 45 20 6e 61 6d 65 20 47 4c 4f  " WHERE name GLO
108b0 42 20 27 25 2e 2a 71 2f 2a 27 20 41 4e 44 20 73  B '%.*q/*' AND s
108c0 75 62 73 74 72 28 6e 61 6d 65 2c 31 2c 25 64 29  ubstr(name,1,%d)
108d0 3d 3d 27 25 2e 2a 71 2f 27 3b 22 2c 0a 20 20 20  =='%.*q/';",.   
108e0 20 20 20 20 20 20 20 20 6e 4e 61 6d 65 2c 20 7a          nName, z
108f0 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 2c 20 6e  Name, nName+1, n
10900 4e 61 6d 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20  Name, zName.    
10910 20 20 20 20 29 20 29 7b 0a 20 20 20 20 20 20 20      ) ){.       
10920 20 20 20 69 66 28 20 50 28 22 63 69 22 29 3d 3d     if( P("ci")==
10930 30 20 29 20 63 67 69 5f 73 65 74 5f 71 75 65 72  0 ) cgi_set_quer
10940 79 5f 70 61 72 61 6d 65 74 65 72 28 22 63 69 22  y_parameter("ci"
10950 2c 22 74 69 70 22 29 3b 0a 20 20 20 20 20 20 20  ,"tip");.       
10960 20 20 20 70 61 67 65 5f 74 72 65 65 28 29 3b 0a     page_tree();.
10970 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
10980 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10990 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20    }.      /* If 
109a0 6e 6f 20 66 69 6c 65 20 6f 72 20 64 69 72 65 63  no file or direc
109b0 74 6f 72 79 20 63 61 6c 6c 65 64 20 4e 41 4d 45  tory called NAME
109c0 3a 20 69 73 73 75 65 20 61 6e 20 65 72 72 6f 72  : issue an error
109d0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 69   */.      if( ri
109e0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
109f0 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22 4e 6f  style_header("No
10a00 20 73 75 63 68 20 66 69 6c 65 22 29 3b 0a 20 20   such file");.  
10a10 20 20 20 20 20 20 40 20 46 69 6c 65 20 27 25 68        @ File '%h
10a20 28 7a 4e 61 6d 65 29 27 20 64 6f 65 73 20 6e 6f  (zName)' does no
10a30 74 20 65 78 69 73 74 20 69 6e 20 74 68 69 73 20  t exist in this 
10a40 72 65 70 6f 73 69 74 6f 72 79 2e 0a 20 20 20 20  repository..    
10a50 20 20 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72      style_footer
10a60 28 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ();.        retu
10a70 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
10a80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 69 64  }else{.      rid
10a90 20 3d 20 6e 61 6d 65 5f 74 6f 5f 72 69 64 5f 77   = name_to_rid_w
10aa0 77 77 28 22 6e 61 6d 65 22 29 3b 0a 20 20 20 20  ww("name");.    
10ab0 7d 0a 20 20 7d 0a 0a 20 20 6c 6f 67 69 6e 5f 63  }.  }..  login_c
10ac0 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73  heck_credentials
10ad0 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 70 65 72  ();.  if( !g.per
10ae0 6d 2e 52 65 61 64 20 29 7b 20 6c 6f 67 69 6e 5f  m.Read ){ login_
10af0 6e 65 65 64 65 64 28 67 2e 61 6e 6f 6e 2e 52 65  needed(g.anon.Re
10b00 61 64 29 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20  ad); return; }. 
10b10 20 69 66 28 20 72 69 64 3d 3d 30 20 29 7b 0a 20   if( rid==0 ){. 
10b20 20 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28     style_header(
10b30 22 4e 6f 20 73 75 63 68 20 61 72 74 69 66 61 63  "No such artifac
10b40 74 22 29 3b 0a 20 20 20 20 40 20 41 72 74 69 66  t");.    @ Artif
10b50 61 63 74 20 27 25 68 28 7a 4e 61 6d 65 29 27 20  act '%h(zName)' 
10b60 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 69  does not exist i
10b70 6e 20 74 68 69 73 20 72 65 70 6f 73 69 74 6f 72  n this repositor
10b80 79 2e 0a 20 20 20 20 73 74 79 6c 65 5f 66 6f 6f  y..    style_foo
10b90 74 65 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72  ter();.    retur
10ba0 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 65 73  n;.  }.  if( des
10bb0 63 4f 6e 6c 79 20 7c 7c 20 50 28 22 76 65 72 62  cOnly || P("verb
10bc0 6f 73 65 22 29 21 3d 30 20 29 7b 0a 20 20 20 20  ose")!=0 ){.    
10bd0 75 72 6c 5f 61 64 64 5f 70 61 72 61 6d 65 74 65  url_add_paramete
10be0 72 28 26 75 72 6c 2c 20 22 76 65 72 62 6f 73 65  r(&url, "verbose
10bf0 22 2c 20 22 31 22 29 3b 0a 20 20 20 20 6f 62 6a  ", "1");.    obj
10c00 64 65 73 63 46 6c 61 67 73 20 7c 3d 20 4f 42 4a  descFlags |= OBJ
10c10 44 45 53 43 5f 44 45 54 41 49 4c 3b 0a 20 20 7d  DESC_DETAIL;.  }
10c20 0a 20 20 7a 55 75 69 64 20 3d 20 64 62 5f 74 65  .  zUuid = db_te
10c30 78 74 28 22 3f 22 2c 20 22 53 45 4c 45 43 54 20  xt("?", "SELECT 
10c40 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62 20 57  uuid FROM blob W
10c50 48 45 52 45 20 72 69 64 3d 25 64 22 2c 20 72 69  HERE rid=%d", ri
10c60 64 29 3b 0a 20 20 69 66 28 20 69 73 46 69 6c 65  d);.  if( isFile
10c70 20 29 7b 0a 20 20 20 20 40 20 3c 68 32 3e 4c 61   ){.    @ <h2>La
10c80 74 65 73 74 20 76 65 72 73 69 6f 6e 20 6f 66 20  test version of 
10c90 66 69 6c 65 20 27 25 68 28 7a 4e 61 6d 65 29 27  file '%h(zName)'
10ca0 3a 3c 2f 68 32 3e 0a 20 20 20 20 73 74 79 6c 65  :</h2>.    style
10cb0 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74  _submenu_element
10cc0 28 22 41 72 74 69 66 61 63 74 22 2c 20 22 25 52  ("Artifact", "%R
10cd0 2f 61 72 74 69 66 61 63 74 2f 25 53 22 2c 20 7a  /artifact/%S", z
10ce0 55 75 69 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69  Uuid);.  }else i
10cf0 66 28 20 67 2e 70 65 72 6d 2e 53 65 74 75 70 20  f( g.perm.Setup 
10d00 29 7b 0a 20 20 20 20 40 20 3c 68 32 3e 41 72 74  ){.    @ <h2>Art
10d10 69 66 61 63 74 20 25 73 28 7a 55 75 69 64 29 20  ifact %s(zUuid) 
10d20 28 25 64 28 72 69 64 29 29 3a 3c 2f 68 32 3e 0a  (%d(rid)):</h2>.
10d30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 40 20 3c    }else{.    @ <
10d40 68 32 3e 41 72 74 69 66 61 63 74 20 25 73 28 7a  h2>Artifact %s(z
10d50 55 75 69 64 29 3a 3c 2f 68 32 3e 0a 20 20 7d 0a  Uuid):</h2>.  }.
10d60 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 64 6f 77    blob_zero(&dow
10d70 6e 6c 6f 61 64 4e 61 6d 65 29 3b 0a 20 20 61 73  nloadName);.  as
10d80 54 65 78 74 20 3d 20 50 28 22 74 78 74 22 29 21  Text = P("txt")!
10d90 3d 30 3b 0a 20 20 69 66 28 20 61 73 54 65 78 74  =0;.  if( asText
10da0 20 29 20 6f 62 6a 64 65 73 63 46 6c 61 67 73 20   ) objdescFlags 
10db0 26 3d 20 7e 4f 42 4a 44 45 53 43 5f 42 41 53 45  &= ~OBJDESC_BASE
10dc0 3b 0a 20 20 6f 62 6a 54 79 70 65 20 3d 20 6f 62  ;.  objType = ob
10dd0 6a 65 63 74 5f 64 65 73 63 72 69 70 74 69 6f 6e  ject_description
10de0 28 72 69 64 2c 20 6f 62 6a 64 65 73 63 46 6c 61  (rid, objdescFla
10df0 67 73 2c 20 26 64 6f 77 6e 6c 6f 61 64 4e 61 6d  gs, &downloadNam
10e00 65 29 3b 0a 20 20 69 66 28 20 21 64 65 73 63 4f  e);.  if( !descO
10e10 6e 6c 79 20 26 26 20 50 28 22 64 6f 77 6e 6c 6f  nly && P("downlo
10e20 61 64 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 63  ad")!=0 ){.    c
10e30 67 69 5f 72 65 64 69 72 65 63 74 66 28 22 25 52  gi_redirectf("%R
10e40 2f 72 61 77 2f 25 54 3f 6e 61 6d 65 3d 25 73 22  /raw/%T?name=%s"
10e50 2c 20 62 6c 6f 62 5f 73 74 72 28 26 64 6f 77 6e  , blob_str(&down
10e60 6c 6f 61 64 4e 61 6d 65 29 2c 0a 20 20 20 20 20  loadName),.     
10e70 20 20 20 20 20 64 62 5f 74 65 78 74 28 22 3f 22       db_text("?"
10e80 2c 20 22 53 45 4c 45 43 54 20 75 75 69 64 20 46  , "SELECT uuid F
10e90 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72  ROM blob WHERE r
10ea0 69 64 3d 25 64 22 2c 20 72 69 64 29 29 3b 0a 20  id=%d", rid));. 
10eb0 20 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a     /*NOTREACHED*
10ec0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 67 2e 70 65  /.  }.  if( g.pe
10ed0 72 6d 2e 41 64 6d 69 6e 20 29 7b 0a 20 20 20 20  rm.Admin ){.    
10ee0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 75 69  const char *zUui
10ef0 64 20 3d 20 64 62 5f 74 65 78 74 28 22 22 2c 20  d = db_text("", 
10f00 22 53 45 4c 45 43 54 20 75 75 69 64 20 46 52 4f  "SELECT uuid FRO
10f10 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69 64  M blob WHERE rid
10f20 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 20 20  =%d", rid);.    
10f30 69 66 28 20 64 62 5f 65 78 69 73 74 73 28 22 53  if( db_exists("S
10f40 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 73 68 75  ELECT 1 FROM shu
10f50 6e 20 57 48 45 52 45 20 75 75 69 64 3d 25 51 22  n WHERE uuid=%Q"
10f60 2c 20 7a 55 75 69 64 29 20 29 7b 0a 20 20 20 20  , zUuid) ){.    
10f70 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f    style_submenu_
10f80 65 6c 65 6d 65 6e 74 28 22 55 6e 73 68 75 6e 22  element("Unshun"
10f90 2c 20 22 25 73 2f 73 68 75 6e 3f 61 63 63 65 70  , "%s/shun?accep
10fa0 74 3d 25 73 26 73 75 62 3d 31 23 61 63 63 73 68  t=%s&sub=1#accsh
10fb0 75 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  un",.           
10fc0 20 67 2e 7a 54 6f 70 2c 20 7a 55 75 69 64 29 3b   g.zTop, zUuid);
10fd0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10fe0 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f    style_submenu_
10ff0 65 6c 65 6d 65 6e 74 28 22 53 68 75 6e 22 2c 20  element("Shun", 
11000 22 25 73 2f 73 68 75 6e 3f 73 68 75 6e 3d 25 73  "%s/shun?shun=%s
11010 23 61 64 64 73 68 75 6e 22 2c 20 67 2e 7a 54 6f  #addshun", g.zTo
11020 70 2c 20 7a 55 75 69 64 29 3b 0a 20 20 20 20 7d  p, zUuid);.    }
11030 0a 20 20 7d 0a 20 20 73 74 79 6c 65 5f 68 65 61  .  }.  style_hea
11040 64 65 72 28 22 25 73 22 2c 20 69 73 46 69 6c 65  der("%s", isFile
11050 20 3f 20 22 46 69 6c 65 20 43 6f 6e 74 65 6e 74   ? "File Content
11060 22 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  " :.            
11070 20 20 20 20 20 20 20 20 20 64 65 73 63 4f 6e 6c           descOnl
11080 79 20 3f 20 22 41 72 74 69 66 61 63 74 20 44 65  y ? "Artifact De
11090 73 63 72 69 70 74 69 6f 6e 22 20 3a 20 22 41 72  scription" : "Ar
110a0 74 69 66 61 63 74 20 43 6f 6e 74 65 6e 74 22 29  tifact Content")
110b0 3b 0a 20 20 69 66 28 20 67 2e 70 65 72 6d 2e 41  ;.  if( g.perm.A
110c0 64 6d 69 6e 20 29 7b 0a 20 20 20 20 53 74 6d 74  dmin ){.    Stmt
110d0 20 71 3b 0a 20 20 20 20 64 62 5f 70 72 65 70 61   q;.    db_prepa
110e0 72 65 28 26 71 2c 0a 20 20 20 20 20 20 22 53 45  re(&q,.      "SE
110f0 4c 45 43 54 20 63 6f 61 6c 65 73 63 65 28 75 73  LECT coalesce(us
11100 65 72 2e 6c 6f 67 69 6e 2c 72 63 76 66 72 6f 6d  er.login,rcvfrom
11110 2e 75 69 64 29 2c 22 0a 20 20 20 20 20 20 22 20  .uid),".      " 
11120 20 20 20 20 20 20 64 61 74 65 74 69 6d 65 28 72        datetime(r
11130 63 76 66 72 6f 6d 2e 6d 74 69 6d 65 2c 74 6f 4c  cvfrom.mtime,toL
11140 6f 63 61 6c 28 29 29 2c 20 72 63 76 66 72 6f 6d  ocal()), rcvfrom
11150 2e 69 70 61 64 64 72 22 0a 20 20 20 20 20 20 22  .ipaddr".      "
11160 20 20 46 52 4f 4d 20 62 6c 6f 62 2c 20 72 63 76    FROM blob, rcv
11170 66 72 6f 6d 20 4c 45 46 54 20 4a 4f 49 4e 20 75  from LEFT JOIN u
11180 73 65 72 20 4f 4e 20 75 73 65 72 2e 75 69 64 3d  ser ON user.uid=
11190 72 63 76 66 72 6f 6d 2e 75 69 64 22 0a 20 20 20  rcvfrom.uid".   
111a0 20 20 20 22 20 57 48 45 52 45 20 62 6c 6f 62 2e     " WHERE blob.
111b0 72 69 64 3d 25 64 22 0a 20 20 20 20 20 20 22 20  rid=%d".      " 
111c0 20 20 41 4e 44 20 72 63 76 66 72 6f 6d 2e 72 63    AND rcvfrom.rc
111d0 76 69 64 3d 62 6c 6f 62 2e 72 63 76 69 64 3b 22  vid=blob.rcvid;"
111e0 2c 20 72 69 64 29 3b 0a 20 20 20 20 77 68 69 6c  , rid);.    whil
111f0 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d  e( db_step(&q)==
11200 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
11210 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
11220 7a 55 73 65 72 20 3d 20 64 62 5f 63 6f 6c 75 6d  zUser = db_colum
11230 6e 5f 74 65 78 74 28 26 71 2c 30 29 3b 0a 20 20  n_text(&q,0);.  
11240 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
11250 7a 44 61 74 65 20 3d 20 64 62 5f 63 6f 6c 75 6d  zDate = db_colum
11260 6e 5f 74 65 78 74 28 26 71 2c 31 29 3b 0a 20 20  n_text(&q,1);.  
11270 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
11280 7a 49 70 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  zIp = db_column_
11290 74 65 78 74 28 26 71 2c 32 29 3b 0a 20 20 20 20  text(&q,2);.    
112a0 20 20 40 20 3c 70 3e 52 65 63 65 69 76 65 64 20    @ <p>Received 
112b0 6f 6e 20 25 73 28 7a 44 61 74 65 29 20 66 72 6f  on %s(zDate) fro
112c0 6d 20 25 68 28 7a 55 73 65 72 29 20 61 74 20 25  m %h(zUser) at %
112d0 68 28 7a 49 70 29 2e 3c 2f 70 3e 0a 20 20 20 20  h(zIp).</p>.    
112e0 7d 0a 20 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a  }.    db_finaliz
112f0 65 28 26 71 29 3b 0a 20 20 7d 0a 20 20 73 74 79  e(&q);.  }.  sty
11300 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65  le_submenu_eleme
11310 6e 74 28 22 44 6f 77 6e 6c 6f 61 64 22 2c 20 22  nt("Download", "
11320 25 52 2f 72 61 77 2f 25 54 3f 6e 61 6d 65 3d 25  %R/raw/%T?name=%
11330 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
11340 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f               blo
11350 62 5f 73 74 72 28 26 64 6f 77 6e 6c 6f 61 64 4e  b_str(&downloadN
11360 61 6d 65 29 2c 20 7a 55 75 69 64 29 3b 0a 20 20  ame), zUuid);.  
11370 69 66 28 20 64 62 5f 65 78 69 73 74 73 28 22 53  if( db_exists("S
11380 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 6d 6c 69  ELECT 1 FROM mli
11390 6e 6b 20 57 48 45 52 45 20 66 69 64 3d 25 64 22  nk WHERE fid=%d"
113a0 2c 20 72 69 64 29 20 29 7b 0a 20 20 20 20 73 74  , rid) ){.    st
113b0 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d  yle_submenu_elem
113c0 65 6e 74 28 22 43 68 65 63 6b 2d 69 6e 73 20 55  ent("Check-ins U
113d0 73 69 6e 67 22 2c 20 22 25 52 2f 74 69 6d 65 6c  sing", "%R/timel
113e0 69 6e 65 3f 6e 3d 32 30 30 26 75 66 3d 25 73 22  ine?n=200&uf=%s"
113f0 2c 20 7a 55 75 69 64 29 3b 0a 20 20 7d 0a 20 20  , zUuid);.  }.  
11400 7a 4d 69 6d 65 20 3d 20 6d 69 6d 65 74 79 70 65  zMime = mimetype
11410 5f 66 72 6f 6d 5f 6e 61 6d 65 28 62 6c 6f 62 5f  _from_name(blob_
11420 73 74 72 28 26 64 6f 77 6e 6c 6f 61 64 4e 61 6d  str(&downloadNam
11430 65 29 29 3b 0a 20 20 69 66 28 20 7a 4d 69 6d 65  e));.  if( zMime
11440 20 29 7b 0a 20 20 20 20 69 66 28 20 66 6f 73 73   ){.    if( foss
11450 69 6c 5f 73 74 72 63 6d 70 28 7a 4d 69 6d 65 2c  il_strcmp(zMime,
11460 20 22 74 65 78 74 2f 68 74 6d 6c 22 29 3d 3d 30   "text/html")==0
11470 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 73   ){.      if( as
11480 54 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Text ){.        
11490 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c  style_submenu_el
114a0 65 6d 65 6e 74 28 22 48 74 6d 6c 22 2c 20 22 25  ement("Html", "%
114b0 73 22 2c 20 75 72 6c 5f 72 65 6e 64 65 72 28 26  s", url_render(&
114c0 75 72 6c 2c 20 22 74 78 74 22 2c 20 30 2c 20 30  url, "txt", 0, 0
114d0 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , 0));.      }el
114e0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 6e 64  se{.        rend
114f0 65 72 41 73 48 74 6d 6c 20 3d 20 31 3b 0a 20 20  erAsHtml = 1;.  
11500 20 20 20 20 20 20 73 74 79 6c 65 5f 73 75 62 6d        style_subm
11510 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 54 65 78  enu_element("Tex
11520 74 22 2c 20 22 25 73 22 2c 20 75 72 6c 5f 72 65  t", "%s", url_re
11530 6e 64 65 72 28 26 75 72 6c 2c 20 22 74 78 74 22  nder(&url, "txt"
11540 2c 20 22 31 22 2c 20 30 2c 20 30 29 29 3b 0a 20  , "1", 0, 0));. 
11550 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
11560 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 72 63   if( fossil_strc
11570 6d 70 28 7a 4d 69 6d 65 2c 20 22 74 65 78 74 2f  mp(zMime, "text/
11580 78 2d 66 6f 73 73 69 6c 2d 77 69 6b 69 22 29 3d  x-fossil-wiki")=
11590 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
115a0 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a   fossil_strcmp(z
115b0 4d 69 6d 65 2c 20 22 74 65 78 74 2f 78 2d 6d 61  Mime, "text/x-ma
115c0 72 6b 64 6f 77 6e 22 29 3d 3d 30 20 29 7b 0a 20  rkdown")==0 ){. 
115d0 20 20 20 20 20 69 66 28 20 61 73 54 65 78 74 20       if( asText 
115e0 29 7b 0a 20 20 20 20 20 20 20 20 73 74 79 6c 65  ){.        style
115f0 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74  _submenu_element
11600 28 22 57 69 6b 69 22 2c 20 22 25 73 22 2c 20 75  ("Wiki", "%s", u
11610 72 6c 5f 72 65 6e 64 65 72 28 26 75 72 6c 2c 20  rl_render(&url, 
11620 22 74 78 74 22 2c 20 30 2c 20 30 2c 20 30 29 29  "txt", 0, 0, 0))
11630 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11640 20 20 20 20 20 20 20 72 65 6e 64 65 72 41 73 57         renderAsW
11650 69 6b 69 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  iki = 1;.       
11660 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65   style_submenu_e
11670 6c 65 6d 65 6e 74 28 22 54 65 78 74 22 2c 20 22  lement("Text", "
11680 25 73 22 2c 20 75 72 6c 5f 72 65 6e 64 65 72 28  %s", url_render(
11690 26 75 72 6c 2c 20 22 74 78 74 22 2c 20 22 31 22  &url, "txt", "1"
116a0 2c 20 30 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  , 0, 0));.      
116b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
116c0 28 20 28 6f 62 6a 54 79 70 65 20 26 20 28 4f 42  ( (objType & (OB
116d0 4a 54 59 50 45 5f 57 49 4b 49 7c 4f 42 4a 54 59  JTYPE_WIKI|OBJTY
116e0 50 45 5f 54 49 43 4b 45 54 29 29 21 3d 30 20 29  PE_TICKET))!=0 )
116f0 7b 0a 20 20 20 20 73 74 79 6c 65 5f 73 75 62 6d  {.    style_subm
11700 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 50 61 72  enu_element("Par
11710 73 65 64 22 2c 20 22 25 52 2f 69 6e 66 6f 2f 25  sed", "%R/info/%
11720 73 22 2c 20 7a 55 75 69 64 29 3b 0a 20 20 7d 0a  s", zUuid);.  }.
11730 20 20 69 66 28 20 64 65 73 63 4f 6e 6c 79 20 29    if( descOnly )
11740 7b 0a 20 20 20 20 73 74 79 6c 65 5f 73 75 62 6d  {.    style_subm
11750 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 43 6f 6e  enu_element("Con
11760 74 65 6e 74 22 2c 20 22 25 52 2f 61 72 74 69 66  tent", "%R/artif
11770 61 63 74 2f 25 73 22 2c 20 7a 55 75 69 64 29 3b  act/%s", zUuid);
11780 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 40 20  .  }else{.    @ 
11790 3c 68 72 20 2f 3e 0a 20 20 20 20 63 6f 6e 74 65  <hr />.    conte
117a0 6e 74 5f 67 65 74 28 72 69 64 2c 20 26 63 6f 6e  nt_get(rid, &con
117b0 74 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  tent);.    if( r
117c0 65 6e 64 65 72 41 73 57 69 6b 69 20 29 7b 0a 20  enderAsWiki ){. 
117d0 20 20 20 20 20 77 69 6b 69 5f 72 65 6e 64 65 72       wiki_render
117e0 5f 62 79 5f 6d 69 6d 65 74 79 70 65 28 26 63 6f  _by_mimetype(&co
117f0 6e 74 65 6e 74 2c 20 7a 4d 69 6d 65 29 3b 0a 20  ntent, zMime);. 
11800 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 6e     }else if( ren
11810 64 65 72 41 73 48 74 6d 6c 20 29 7b 0a 20 20 20  derAsHtml ){.   
11820 20 20 20 40 20 3c 69 66 72 61 6d 65 20 73 72 63     @ <iframe src
11830 3d 22 25 52 2f 72 61 77 2f 25 54 28 62 6c 6f 62  ="%R/raw/%T(blob
11840 5f 73 74 72 28 26 64 6f 77 6e 6c 6f 61 64 4e 61  _str(&downloadNa
11850 6d 65 29 29 3f 6e 61 6d 65 3d 25 73 28 7a 55 75  me))?name=%s(zUu
11860 69 64 29 22 0a 20 20 20 20 20 20 40 20 77 69 64  id)".      @ wid
11870 74 68 3d 22 31 30 30 25 25 22 20 66 72 61 6d 65  th="100%%" frame
11880 62 6f 72 64 65 72 3d 22 30 22 20 6d 61 72 67 69  border="0" margi
11890 6e 77 69 64 74 68 3d 22 30 22 20 6d 61 72 67 69  nwidth="0" margi
118a0 6e 68 65 69 67 68 74 3d 22 30 22 0a 20 20 20 20  nheight="0".    
118b0 20 20 40 20 73 61 6e 64 62 6f 78 3d 22 61 6c 6c    @ sandbox="all
118c0 6f 77 2d 73 61 6d 65 2d 6f 72 69 67 69 6e 22 20  ow-same-origin" 
118d0 69 64 3d 22 69 66 6d 31 22 3e 0a 20 20 20 20 20  id="ifm1">.     
118e0 20 40 20 3c 2f 69 66 72 61 6d 65 3e 0a 20 20 20   @ </iframe>.   
118f0 20 20 20 40 20 3c 73 63 72 69 70 74 20 6e 6f 6e     @ <script non
11900 63 65 3d 22 25 68 28 73 74 79 6c 65 5f 6e 6f 6e  ce="%h(style_non
11910 63 65 28 29 29 22 3e 0a 20 20 20 20 20 20 40 20  ce())">.      @ 
11920 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d  document.getElem
11930 65 6e 74 42 79 49 64 28 22 69 66 6d 31 22 29 2e  entById("ifm1").
11940 61 64 64 45 76 65 6e 74 4c 69 73 74 65 6e 65 72  addEventListener
11950 28 22 6c 6f 61 64 22 2c 0a 20 20 20 20 20 20 40  ("load",.      @
11960 20 20 20 66 75 6e 63 74 69 6f 6e 28 29 7b 0a 20     function(){. 
11970 20 20 20 20 20 40 20 20 20 20 20 74 68 69 73 2e       @     this.
11980 68 65 69 67 68 74 3d 74 68 69 73 2e 63 6f 6e 74  height=this.cont
11990 65 6e 74 44 6f 63 75 6d 65 6e 74 2e 64 6f 63 75  entDocument.docu
119a0 6d 65 6e 74 45 6c 65 6d 65 6e 74 2e 73 63 72 6f  mentElement.scro
119b0 6c 6c 48 65 69 67 68 74 20 2b 20 37 35 3b 0a 20  llHeight + 75;. 
119c0 20 20 20 20 20 40 20 20 20 7d 0a 20 20 20 20 20       @   }.     
119d0 20 40 20 29 3b 0a 20 20 20 20 20 20 40 20 3c 2f   @ );.      @ </
119e0 73 63 72 69 70 74 3e 0a 20 20 20 20 7d 65 6c 73  script>.    }els
119f0 65 7b 0a 20 20 20 20 20 20 73 74 79 6c 65 5f 73  e{.      style_s
11a00 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22  ubmenu_element("
11a10 48 65 78 22 2c 20 22 25 73 2f 68 65 78 64 75 6d  Hex", "%s/hexdum
11a20 70 3f 6e 61 6d 65 3d 25 73 22 2c 20 67 2e 7a 54  p?name=%s", g.zT
11a30 6f 70 2c 20 7a 55 75 69 64 29 3b 0a 20 20 20 20  op, zUuid);.    
11a40 20 20 69 66 28 20 7a 4c 6e 3d 3d 30 20 7c 7c 20    if( zLn==0 || 
11a50 61 74 6f 69 28 7a 4c 6e 29 3d 3d 30 20 29 7b 0a  atoi(zLn)==0 ){.
11a60 20 20 20 20 20 20 20 20 73 74 79 6c 65 5f 73 75          style_su
11a70 62 6d 65 6e 75 5f 63 68 65 63 6b 62 6f 78 28 22  bmenu_checkbox("
11a80 6c 6e 22 2c 20 22 4c 69 6e 65 20 4e 75 6d 62 65  ln", "Line Numbe
11a90 72 73 22 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  rs", 0, 0);.    
11aa0 20 20 7d 0a 20 20 20 20 20 20 62 6c 6f 62 5f 74    }.      blob_t
11ab0 6f 5f 75 74 66 38 5f 6e 6f 5f 62 6f 6d 28 26 63  o_utf8_no_bom(&c
11ac0 6f 6e 74 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20  ontent, 0);.    
11ad0 20 20 7a 4d 69 6d 65 20 3d 20 6d 69 6d 65 74 79    zMime = mimety
11ae0 70 65 5f 66 72 6f 6d 5f 63 6f 6e 74 65 6e 74 28  pe_from_content(
11af0 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  &content);.     
11b00 20 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a   @ <blockquote>.
11b10 20 20 20 20 20 20 69 66 28 20 7a 4d 69 6d 65 3d        if( zMime=
11b20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
11b30 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
11b40 20 20 20 20 20 7a 20 3d 20 62 6c 6f 62 5f 73 74       z = blob_st
11b50 72 28 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  r(&content);.   
11b60 20 20 20 20 20 69 66 28 20 7a 4c 6e 20 29 7b 0a       if( zLn ){.
11b70 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
11b80 5f 74 65 78 74 5f 77 69 74 68 5f 6c 69 6e 65 5f  _text_with_line_
11b90 6e 75 6d 62 65 72 73 28 7a 2c 20 7a 4c 6e 29 3b  numbers(z, zLn);
11ba0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
11bb0 20 20 20 20 20 20 20 20 20 20 40 20 3c 70 72 65            @ <pre
11bc0 3e 0a 20 20 20 20 20 20 20 20 20 20 40 20 25 68  >.          @ %h
11bd0 28 7a 29 0a 20 20 20 20 20 20 20 20 20 20 40 20  (z).          @ 
11be0 3c 2f 70 72 65 3e 0a 20 20 20 20 20 20 20 20 7d  </pre>.        }
11bf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
11c00 20 73 74 72 6e 63 6d 70 28 7a 4d 69 6d 65 2c 20   strncmp(zMime, 
11c10 22 69 6d 61 67 65 2f 22 2c 20 36 29 3d 3d 30 20  "image/", 6)==0 
11c20 29 7b 0a 20 20 20 20 20 20 20 20 40 20 3c 70 3e  ){.        @ <p>
11c30 28 66 69 6c 65 20 69 73 20 25 64 28 62 6c 6f 62  (file is %d(blob
11c40 5f 73 69 7a 65 28 26 63 6f 6e 74 65 6e 74 29 29  _size(&content))
11c50 20 62 79 74 65 73 20 6f 66 20 69 6d 61 67 65 20   bytes of image 
11c60 64 61 74 61 29 3c 2f 69 3e 3c 2f 70 3e 0a 20 20  data)</i></p>.  
11c70 20 20 20 20 20 20 40 20 3c 70 3e 3c 69 6d 67 20        @ <p><img 
11c80 73 72 63 3d 22 25 52 2f 72 61 77 2f 25 73 28 7a  src="%R/raw/%s(z
11c90 55 75 69 64 29 3f 6d 3d 25 73 28 7a 4d 69 6d 65  Uuid)?m=%s(zMime
11ca0 29 22 3e 3c 2f 70 3e 0a 20 20 20 20 20 20 20 20  )"></p>.        
11cb0 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c  style_submenu_el
11cc0 65 6d 65 6e 74 28 22 49 6d 61 67 65 22 2c 20 22  ement("Image", "
11cd0 25 52 2f 72 61 77 2f 25 73 3f 6d 3d 25 73 22 2c  %R/raw/%s?m=%s",
11ce0 20 7a 55 75 69 64 2c 20 7a 4d 69 6d 65 29 3b 0a   zUuid, zMime);.
11cf0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11d00 20 20 20 20 20 40 20 3c 69 3e 28 66 69 6c 65 20       @ <i>(file 
11d10 69 73 20 25 64 28 62 6c 6f 62 5f 73 69 7a 65 28  is %d(blob_size(
11d20 26 63 6f 6e 74 65 6e 74 29 29 20 62 79 74 65 73  &content)) bytes
11d30 20 6f 66 20 62 69 6e 61 72 79 20 64 61 74 61 29   of binary data)
11d40 3c 2f 69 3e 0a 20 20 20 20 20 20 7d 0a 20 20 20  </i>.      }.   
11d50 20 20 20 40 20 3c 2f 62 6c 6f 63 6b 71 75 6f 74     @ </blockquot
11d60 65 3e 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  e>.    }.  }.  s
11d70 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d  tyle_footer();.}
11d80 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a  ../*.** WEBPAGE:
11d90 20 74 69 6e 66 6f 0a 2a 2a 20 55 52 4c 3a 20 2f   tinfo.** URL: /
11da0 74 69 6e 66 6f 3f 6e 61 6d 65 3d 41 52 54 49 46  tinfo?name=ARTIF
11db0 41 43 54 49 44 0a 2a 2a 0a 2a 2a 20 53 68 6f 77  ACTID.**.** Show
11dc0 20 74 68 65 20 64 65 74 61 69 6c 73 20 6f 66 20   the details of 
11dd0 61 20 74 69 63 6b 65 74 20 63 68 61 6e 67 65 20  a ticket change 
11de0 63 6f 6e 74 72 6f 6c 20 61 72 74 69 66 61 63 74  control artifact
11df0 2e 0a 2a 2f 0a 76 6f 69 64 20 74 69 6e 66 6f 5f  ..*/.void tinfo_
11e00 70 61 67 65 28 76 6f 69 64 29 7b 0a 20 20 69 6e  page(void){.  in
11e10 74 20 72 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a  t rid;.  char *z
11e20 44 61 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Date;.  const ch
11e30 61 72 20 2a 7a 55 75 69 64 3b 0a 20 20 63 68 61  ar *zUuid;.  cha
11e40 72 20 7a 54 6b 74 4e 61 6d 65 5b 48 4e 41 4d 45  r zTktName[HNAME
11e50 5f 4d 41 58 2b 31 5d 3b 0a 20 20 4d 61 6e 69 66  _MAX+1];.  Manif
11e60 65 73 74 20 2a 70 54 6b 74 43 68 6e 67 3b 0a 20  est *pTktChng;. 
11e70 20 69 6e 74 20 6d 6f 64 50 65 6e 64 69 6e 67 3b   int modPending;
11e80 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
11e90 4d 6f 64 41 63 74 69 6f 6e 3b 0a 20 20 63 68 61  ModAction;.  cha
11ea0 72 20 2a 7a 54 6b 74 54 69 74 6c 65 3b 0a 20 20  r *zTktTitle;.  
11eb0 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64  login_check_cred
11ec0 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28  entials();.  if(
11ed0 20 21 67 2e 70 65 72 6d 2e 52 64 54 6b 74 20 29   !g.perm.RdTkt )
11ee0 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 67  { login_needed(g
11ef0 2e 61 6e 6f 6e 2e 52 64 54 6b 74 29 3b 20 72 65  .anon.RdTkt); re
11f00 74 75 72 6e 3b 20 7d 0a 20 20 72 69 64 20 3d 20  turn; }.  rid = 
11f10 6e 61 6d 65 5f 74 6f 5f 72 69 64 5f 77 77 77 28  name_to_rid_www(
11f20 22 6e 61 6d 65 22 29 3b 0a 20 20 69 66 28 20 72  "name");.  if( r
11f30 69 64 3d 3d 30 20 29 7b 20 66 6f 73 73 69 6c 5f  id==0 ){ fossil_
11f40 72 65 64 69 72 65 63 74 5f 68 6f 6d 65 28 29 3b  redirect_home();
11f50 20 7d 0a 20 20 7a 55 75 69 64 20 3d 20 64 62 5f   }.  zUuid = db_
11f60 74 65 78 74 28 22 22 2c 20 22 53 45 4c 45 43 54  text("", "SELECT
11f70 20 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62 20   uuid FROM blob 
11f80 57 48 45 52 45 20 72 69 64 3d 25 64 22 2c 20 72  WHERE rid=%d", r
11f90 69 64 29 3b 0a 20 20 69 66 28 20 67 2e 70 65 72  id);.  if( g.per
11fa0 6d 2e 41 64 6d 69 6e 20 29 7b 0a 20 20 20 20 69  m.Admin ){.    i
11fb0 66 28 20 64 62 5f 65 78 69 73 74 73 28 22 53 45  f( db_exists("SE
11fc0 4c 45 43 54 20 31 20 46 52 4f 4d 20 73 68 75 6e  LECT 1 FROM shun
11fd0 20 57 48 45 52 45 20 75 75 69 64 3d 25 51 22 2c   WHERE uuid=%Q",
11fe0 20 7a 55 75 69 64 29 20 29 7b 0a 20 20 20 20 20   zUuid) ){.     
11ff0 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65   style_submenu_e
12000 6c 65 6d 65 6e 74 28 22 55 6e 73 68 75 6e 22 2c  lement("Unshun",
12010 20 22 25 73 2f 73 68 75 6e 3f 61 63 63 65 70 74   "%s/shun?accept
12020 3d 25 73 26 73 75 62 3d 31 23 61 63 63 73 68 75  =%s&sub=1#accshu
12030 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
12040 67 2e 7a 54 6f 70 2c 20 7a 55 75 69 64 29 3b 0a  g.zTop, zUuid);.
12050 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12060 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65   style_submenu_e
12070 6c 65 6d 65 6e 74 28 22 53 68 75 6e 22 2c 20 22  lement("Shun", "
12080 25 73 2f 73 68 75 6e 3f 73 68 75 6e 3d 25 73 23  %s/shun?shun=%s#
12090 61 64 64 73 68 75 6e 22 2c 20 67 2e 7a 54 6f 70  addshun", g.zTop
120a0 2c 20 7a 55 75 69 64 29 3b 0a 20 20 20 20 7d 0a  , zUuid);.    }.
120b0 20 20 7d 0a 20 20 70 54 6b 74 43 68 6e 67 20 3d    }.  pTktChng =
120c0 20 6d 61 6e 69 66 65 73 74 5f 67 65 74 28 72 69   manifest_get(ri
120d0 64 2c 20 43 46 54 59 50 45 5f 54 49 43 4b 45 54  d, CFTYPE_TICKET
120e0 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 6b 74  , 0);.  if( pTkt
120f0 43 68 6e 67 3d 3d 30 20 29 20 66 6f 73 73 69 6c  Chng==0 ) fossil
12100 5f 72 65 64 69 72 65 63 74 5f 68 6f 6d 65 28 29  _redirect_home()
12110 3b 0a 20 20 7a 44 61 74 65 20 3d 20 64 62 5f 74  ;.  zDate = db_t
12120 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 64  ext(0, "SELECT d
12130 61 74 65 74 69 6d 65 28 25 2e 31 32 66 29 22 2c  atetime(%.12f)",
12140 20 70 54 6b 74 43 68 6e 67 2d 3e 72 44 61 74 65   pTktChng->rDate
12150 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  );.  sqlite3_snp
12160 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 6b  rintf(sizeof(zTk
12170 74 4e 61 6d 65 29 2c 20 7a 54 6b 74 4e 61 6d 65  tName), zTktName
12180 2c 20 22 25 73 22 2c 20 70 54 6b 74 43 68 6e 67  , "%s", pTktChng
12190 2d 3e 7a 54 69 63 6b 65 74 55 75 69 64 29 3b 0a  ->zTicketUuid);.
121a0 20 20 69 66 28 20 67 2e 70 65 72 6d 2e 4d 6f 64    if( g.perm.Mod
121b0 54 6b 74 20 26 26 20 28 7a 4d 6f 64 41 63 74 69  Tkt && (zModActi
121c0 6f 6e 20 3d 20 50 28 22 6d 6f 64 61 63 74 69 6f  on = P("modactio
121d0 6e 22 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  n"))!=0 ){.    i
121e0 66 28 20 73 74 72 63 6d 70 28 7a 4d 6f 64 41 63  f( strcmp(zModAc
121f0 74 69 6f 6e 2c 22 64 65 6c 65 74 65 22 29 3d 3d  tion,"delete")==
12200 30 20 29 7b 0a 20 20 20 20 20 20 6d 6f 64 65 72  0 ){.      moder
12210 61 74 69 6f 6e 5f 64 69 73 61 70 70 72 6f 76 65  ation_disapprove
12220 28 72 69 64 29 3b 0a 20 20 20 20 20 20 2f 2a 0a  (rid);.      /*.
12230 20 20 20 20 20 20 2a 2a 20 4e 65 78 74 2c 20 63        ** Next, c
12240 68 65 63 6b 20 69 66 20 74 68 65 20 74 69 63 6b  heck if the tick
12250 65 74 20 73 74 69 6c 6c 20 65 78 69 73 74 73 3b  et still exists;
12260 20 69 66 20 6e 6f 74 2c 20 77 65 20 63 61 6e 6e   if not, we cann
12270 6f 74 0a 20 20 20 20 20 20 2a 2a 20 72 65 64 69  ot.      ** redi
12280 72 65 63 74 20 74 6f 20 69 74 2e 0a 20 20 20 20  rect to it..    
12290 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64    */.      if( d
122a0 62 5f 65 78 69 73 74 73 28 22 53 45 4c 45 43 54  b_exists("SELECT
122b0 20 31 20 46 52 4f 4d 20 74 69 63 6b 65 74 20 57   1 FROM ticket W
122c0 48 45 52 45 20 74 6b 74 5f 75 75 69 64 20 47 4c  HERE tkt_uuid GL
122d0 4f 42 20 27 25 71 2a 27 22 2c 0a 20 20 20 20 20  OB '%q*'",.     
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
122f0 54 6b 74 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  TktName) ){.    
12300 20 20 20 20 63 67 69 5f 72 65 64 69 72 65 63 74      cgi_redirect
12310 66 28 22 25 52 2f 74 6b 74 76 69 65 77 2f 25 73  f("%R/tktview/%s
12320 22 2c 20 7a 54 6b 74 4e 61 6d 65 29 3b 0a 20 20  ", zTktName);.  
12330 20 20 20 20 20 20 2f 2a 4e 4f 54 52 45 41 43 48        /*NOTREACH
12340 45 44 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  ED*/.      }else
12350 7b 0a 20 20 20 20 20 20 20 20 63 67 69 5f 72 65  {.        cgi_re
12360 64 69 72 65 63 74 66 28 22 25 52 2f 6d 6f 64 72  directf("%R/modr
12370 65 71 22 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  eq");.        /*
12380 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 20  NOTREACHED*/.   
12390 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
123a0 66 28 20 73 74 72 63 6d 70 28 7a 4d 6f 64 41 63  f( strcmp(zModAc
123b0 74 69 6f 6e 2c 22 61 70 70 72 6f 76 65 22 29 3d  tion,"approve")=
123c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 6f 64 65  =0 ){.      mode
123d0 72 61 74 69 6f 6e 5f 61 70 70 72 6f 76 65 28 72  ration_approve(r
123e0 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  id);.    }.  }. 
123f0 20 7a 54 6b 74 54 69 74 6c 65 20 3d 20 64 62 5f   zTktTitle = db_
12400 74 61 62 6c 65 5f 68 61 73 5f 63 6f 6c 75 6d 6e  table_has_column
12410 28 22 72 65 70 6f 73 69 74 6f 72 79 22 2c 20 22  ("repository", "
12420 74 69 63 6b 65 74 22 2c 20 22 74 69 74 6c 65 22  ticket", "title"
12430 20 29 0a 20 20 20 20 20 20 3f 20 64 62 5f 74 65   ).      ? db_te
12440 78 74 28 22 28 4e 6f 20 74 69 74 6c 65 29 22 2c  xt("(No title)",
12450 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
12460 20 20 22 53 45 4c 45 43 54 20 74 69 74 6c 65 20    "SELECT title 
12470 46 52 4f 4d 20 74 69 63 6b 65 74 20 57 48 45 52  FROM ticket WHER
12480 45 20 74 6b 74 5f 75 75 69 64 3d 25 51 22 2c 20  E tkt_uuid=%Q", 
12490 7a 54 6b 74 4e 61 6d 65 29 0a 20 20 20 20 20 20  zTktName).      
124a0 3a 20 30 3b 0a 20 20 73 74 79 6c 65 5f 68 65 61  : 0;.  style_hea
124b0 64 65 72 28 22 54 69 63 6b 65 74 20 43 68 61 6e  der("Ticket Chan
124c0 67 65 20 44 65 74 61 69 6c 73 22 29 3b 0a 20 20  ge Details");.  
124d0 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c  style_submenu_el
124e0 65 6d 65 6e 74 28 22 52 61 77 22 2c 20 22 25 52  ement("Raw", "%R
124f0 2f 61 72 74 69 66 61 63 74 2f 25 73 22 2c 20 7a  /artifact/%s", z
12500 55 75 69 64 29 3b 0a 20 20 73 74 79 6c 65 5f 73  Uuid);.  style_s
12510 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22  ubmenu_element("
12520 48 69 73 74 6f 72 79 22 2c 20 22 25 52 2f 74 6b  History", "%R/tk
12530 74 68 69 73 74 6f 72 79 2f 25 73 22 2c 20 7a 54  thistory/%s", zT
12540 6b 74 4e 61 6d 65 29 3b 0a 20 20 73 74 79 6c 65  ktName);.  style
12550 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74  _submenu_element
12560 28 22 50 61 67 65 22 2c 20 22 25 52 2f 74 6b 74  ("Page", "%R/tkt
12570 76 69 65 77 2f 25 74 22 2c 20 7a 54 6b 74 4e 61  view/%t", zTktNa
12580 6d 65 29 3b 0a 20 20 73 74 79 6c 65 5f 73 75 62  me);.  style_sub
12590 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 54 69  menu_element("Ti
125a0 6d 65 6c 69 6e 65 22 2c 20 22 25 52 2f 74 6b 74  meline", "%R/tkt
125b0 74 69 6d 65 6c 69 6e 65 2f 25 74 22 2c 20 7a 54  timeline/%t", zT
125c0 6b 74 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 50  ktName);.  if( P
125d0 28 22 70 6c 61 69 6e 74 65 78 74 22 29 20 29 7b  ("plaintext") ){
125e0 0a 20 20 20 20 73 74 79 6c 65 5f 73 75 62 6d 65  .    style_subme
125f0 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 46 6f 72 6d  nu_element("Form
12600 61 74 74 65 64 22 2c 20 22 25 52 2f 69 6e 66 6f  atted", "%R/info
12610 2f 25 73 22 2c 20 7a 55 75 69 64 29 3b 0a 20 20  /%s", zUuid);.  
12620 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 79 6c 65  }else{.    style
12630 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74  _submenu_element
12640 28 22 50 6c 61 69 6e 74 65 78 74 22 2c 20 22 25  ("Plaintext", "%
12650 52 2f 69 6e 66 6f 2f 25 73 3f 70 6c 61 69 6e 74  R/info/%s?plaint
12660 65 78 74 22 2c 20 7a 55 75 69 64 29 3b 0a 20 20  ext", zUuid);.  
12670 7d 0a 0a 20 20 40 20 3c 64 69 76 20 63 6c 61 73  }..  @ <div clas
12680 73 3d 22 73 65 63 74 69 6f 6e 22 3e 4f 76 65 72  s="section">Over
12690 76 69 65 77 3c 2f 64 69 76 3e 0a 20 20 40 20 3c  view</div>.  @ <
126a0 70 3e 3c 74 61 62 6c 65 20 63 6c 61 73 73 3d 22  p><table class="
126b0 6c 61 62 65 6c 2d 76 61 6c 75 65 22 3e 0a 20 20  label-value">.  
126c0 40 20 3c 74 72 3e 3c 74 68 3e 41 72 74 69 66 61  @ <tr><th>Artifa
126d0 63 74 26 6e 62 73 70 3b 49 44 3a 3c 2f 74 68 3e  ct&nbsp;ID:</th>
126e0 0a 20 20 40 20 3c 74 64 3e 25 7a 28 68 72 65 66  .  @ <td>%z(href
126f0 28 22 25 52 2f 61 72 74 69 66 61 63 74 2f 25 21  ("%R/artifact/%!
12700 53 22 2c 7a 55 75 69 64 29 29 25 73 28 7a 55 75  S",zUuid))%s(zUu
12710 69 64 29 3c 2f 61 3e 0a 20 20 69 66 28 20 67 2e  id)</a>.  if( g.
12720 70 65 72 6d 2e 53 65 74 75 70 20 29 7b 0a 20 20  perm.Setup ){.  
12730 20 20 40 20 28 25 64 28 72 69 64 29 29 0a 20 20    @ (%d(rid)).  
12740 7d 0a 20 20 6d 6f 64 50 65 6e 64 69 6e 67 20 3d  }.  modPending =
12750 20 6d 6f 64 65 72 61 74 69 6f 6e 5f 70 65 6e 64   moderation_pend
12760 69 6e 67 5f 77 77 77 28 72 69 64 29 3b 0a 20 20  ing_www(rid);.  
12770 40 20 3c 74 72 3e 3c 74 68 3e 54 69 63 6b 65 74  @ <tr><th>Ticket
12780 3a 3c 2f 74 68 3e 0a 20 20 40 20 3c 74 64 3e 25  :</th>.  @ <td>%
12790 7a 28 68 72 65 66 28 22 25 52 2f 74 6b 74 76 69  z(href("%R/tktvi
127a0 65 77 2f 25 73 22 2c 7a 54 6b 74 4e 61 6d 65 29  ew/%s",zTktName)
127b0 29 25 73 28 7a 54 6b 74 4e 61 6d 65 29 3c 2f 61  )%s(zTktName)</a
127c0 3e 0a 20 20 69 66 28 20 7a 54 6b 74 54 69 74 6c  >.  if( zTktTitl
127d0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 40 3c 62  e ){.        @<b
127e0 72 20 2f 3e 25 68 28 7a 54 6b 74 54 69 74 6c 65  r />%h(zTktTitle
127f0 29 0a 20 20 7d 0a 20 20 40 3c 2f 74 64 3e 3c 2f  ).  }.  @</td></
12800 74 72 3e 0a 20 20 40 20 3c 74 72 3e 3c 74 68 3e  tr>.  @ <tr><th>
12810 55 73 65 72 26 6e 62 73 70 3b 26 61 6d 70 3b 26  User&nbsp;&amp;&
12820 6e 62 73 70 3b 44 61 74 65 3a 3c 2f 74 68 3e 3c  nbsp;Date:</th><
12830 74 64 3e 0a 20 20 68 79 70 65 72 6c 69 6e 6b 5f  td>.  hyperlink_
12840 74 6f 5f 75 73 65 72 28 70 54 6b 74 43 68 6e 67  to_user(pTktChng
12850 2d 3e 7a 55 73 65 72 2c 20 7a 44 61 74 65 2c 20  ->zUser, zDate, 
12860 22 20 6f 6e 20 22 29 3b 0a 20 20 68 79 70 65 72  " on ");.  hyper
12870 6c 69 6e 6b 5f 74 6f 5f 64 61 74 65 28 7a 44 61  link_to_date(zDa
12880 74 65 2c 20 22 3c 2f 74 64 3e 3c 2f 74 72 3e 22  te, "</td></tr>"
12890 29 3b 0a 20 20 40 20 3c 2f 74 61 62 6c 65 3e 0a  );.  @ </table>.
128a0 20 20 66 72 65 65 28 7a 44 61 74 65 29 3b 0a 20    free(zDate);. 
128b0 20 66 72 65 65 28 7a 54 6b 74 54 69 74 6c 65 29   free(zTktTitle)
128c0 3b 0a 0a 20 20 69 66 28 20 67 2e 70 65 72 6d 2e  ;..  if( g.perm.
128d0 4d 6f 64 54 6b 74 20 26 26 20 6d 6f 64 50 65 6e  ModTkt && modPen
128e0 64 69 6e 67 20 29 7b 0a 20 20 20 20 40 20 3c 64  ding ){.    @ <d
128f0 69 76 20 63 6c 61 73 73 3d 22 73 65 63 74 69 6f  iv class="sectio
12900 6e 22 3e 4d 6f 64 65 72 61 74 69 6f 6e 3c 2f 64  n">Moderation</d
12910 69 76 3e 0a 20 20 20 20 40 20 3c 62 6c 6f 63 6b  iv>.    @ <block
12920 71 75 6f 74 65 3e 0a 20 20 20 20 40 20 3c 66 6f  quote>.    @ <fo
12930 72 6d 20 6d 65 74 68 6f 64 3d 22 50 4f 53 54 22  rm method="POST"
12940 20 61 63 74 69 6f 6e 3d 22 25 52 2f 74 69 6e 66   action="%R/tinf
12950 6f 2f 25 73 28 7a 55 75 69 64 29 22 3e 0a 20 20  o/%s(zUuid)">.  
12960 20 20 40 20 3c 6c 61 62 65 6c 3e 3c 69 6e 70 75    @ <label><inpu
12970 74 20 74 79 70 65 3d 22 72 61 64 69 6f 22 20 6e  t type="radio" n
12980 61 6d 65 3d 22 6d 6f 64 61 63 74 69 6f 6e 22 20  ame="modaction" 
12990 76 61 6c 75 65 3d 22 64 65 6c 65 74 65 22 3e 0a  value="delete">.
129a0 20 20 20 20 40 20 44 65 6c 65 74 65 20 74 68 69      @ Delete thi
129b0 73 20 63 68 61 6e 67 65 3c 2f 6c 61 62 65 6c 3e  s change</label>
129c0 3c 62 72 20 2f 3e 0a 20 20 20 20 40 20 3c 6c 61  <br />.    @ <la
129d0 62 65 6c 3e 3c 69 6e 70 75 74 20 74 79 70 65 3d  bel><input type=
129e0 22 72 61 64 69 6f 22 20 6e 61 6d 65 3d 22 6d 6f  "radio" name="mo
129f0 64 61 63 74 69 6f 6e 22 20 76 61 6c 75 65 3d 22  daction" value="
12a00 61 70 70 72 6f 76 65 22 3e 0a 20 20 20 20 40 20  approve">.    @ 
12a10 41 70 70 72 6f 76 65 20 74 68 69 73 20 63 68 61  Approve this cha
12a20 6e 67 65 3c 2f 6c 61 62 65 6c 3e 3c 62 72 20 2f  nge</label><br /
12a30 3e 0a 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74  >.    @ <input t
12a40 79 70 65 3d 22 73 75 62 6d 69 74 22 20 76 61 6c  ype="submit" val
12a50 75 65 3d 22 53 75 62 6d 69 74 22 3e 0a 20 20 20  ue="Submit">.   
12a60 20 40 20 3c 2f 66 6f 72 6d 3e 0a 20 20 20 20 40   @ </form>.    @
12a70 20 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20   </blockquote>. 
12a80 20 7d 0a 0a 20 20 40 20 3c 64 69 76 20 63 6c 61   }..  @ <div cla
12a90 73 73 3d 22 73 65 63 74 69 6f 6e 22 3e 43 68 61  ss="section">Cha
12aa0 6e 67 65 73 3c 2f 64 69 76 3e 0a 20 20 40 20 3c  nges</div>.  @ <
12ab0 70 3e 0a 20 20 74 69 63 6b 65 74 5f 6f 75 74 70  p>.  ticket_outp
12ac0 75 74 5f 63 68 61 6e 67 65 5f 61 72 74 69 66 61  ut_change_artifa
12ad0 63 74 28 70 54 6b 74 43 68 6e 67 2c 20 30 29 3b  ct(pTktChng, 0);
12ae0 0a 20 20 6d 61 6e 69 66 65 73 74 5f 64 65 73 74  .  manifest_dest
12af0 72 6f 79 28 70 54 6b 74 43 68 6e 67 29 3b 0a 20  roy(pTktChng);. 
12b00 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b   style_footer();
12b10 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41  .}.../*.** WEBPA
12b20 47 45 3a 20 69 6e 66 6f 0a 2a 2a 20 55 52 4c 3a  GE: info.** URL:
12b30 20 69 6e 66 6f 2f 41 52 54 49 46 41 43 54 49 44   info/ARTIFACTID
12b40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  .**.** The argum
12b50 65 6e 74 20 69 73 20 61 20 61 72 74 69 66 61 63  ent is a artifac
12b60 74 20 49 44 20 77 68 69 63 68 20 6d 69 67 68 74  t ID which might
12b70 20 62 65 20 61 20 63 68 65 63 6b 2d 69 6e 20 6f   be a check-in o
12b80 72 20 61 20 66 69 6c 65 20 6f 72 0a 2a 2a 20 61  r a file or.** a
12b90 20 74 69 63 6b 65 74 20 63 68 61 6e 67 65 73 20   ticket changes 
12ba0 6f 72 20 61 20 77 69 6b 69 20 65 64 69 74 20 6f  or a wiki edit o
12bb0 72 20 73 6f 6d 65 74 68 69 6e 67 20 65 6c 73 65  r something else
12bc0 2e 0a 2a 2a 0a 2a 2a 20 46 69 67 75 72 65 20 6f  ..**.** Figure o
12bd0 75 74 20 77 68 61 74 20 74 68 65 20 61 72 74 69  ut what the arti
12be0 66 61 63 74 20 49 44 20 69 73 20 61 6e 64 20 64  fact ID is and d
12bf0 69 73 70 6c 61 79 20 69 74 20 61 70 70 72 6f 70  isplay it approp
12c00 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  riately..*/.void
12c10 20 69 6e 66 6f 5f 70 61 67 65 28 76 6f 69 64 29   info_page(void)
12c20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
12c30 7a 4e 61 6d 65 3b 0a 20 20 42 6c 6f 62 20 75 75  zName;.  Blob uu
12c40 69 64 3b 0a 20 20 69 6e 74 20 72 69 64 3b 0a 20  id;.  int rid;. 
12c50 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
12c60 4c 65 6e 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20  Len;..  zName = 
12c70 50 28 22 6e 61 6d 65 22 29 3b 0a 20 20 69 66 28  P("name");.  if(
12c80 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 66 6f 73 73   zName==0 ) foss
12c90 69 6c 5f 72 65 64 69 72 65 63 74 5f 68 6f 6d 65  il_redirect_home
12ca0 28 29 3b 0a 20 20 6e 4c 65 6e 20 3d 20 73 74 72  ();.  nLen = str
12cb0 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 62 6c  len(zName);.  bl
12cc0 6f 62 5f 73 65 74 28 26 75 75 69 64 2c 20 7a 4e  ob_set(&uuid, zN
12cd0 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 61 6d 65  ame);.  if( name
12ce0 5f 63 6f 6c 6c 69 73 69 6f 6e 73 28 7a 4e 61 6d  _collisions(zNam
12cf0 65 29 20 29 7b 0a 20 20 20 20 63 67 69 5f 73 65  e) ){.    cgi_se
12d00 74 5f 70 61 72 61 6d 65 74 65 72 28 22 73 72 63  t_parameter("src
12d10 22 2c 22 69 6e 66 6f 22 29 3b 0a 20 20 20 20 61  ","info");.    a
12d20 6d 62 69 67 75 6f 75 73 5f 70 61 67 65 28 29 3b  mbiguous_page();
12d30 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
12d40 0a 20 20 72 63 20 3d 20 6e 61 6d 65 5f 74 6f 5f  .  rc = name_to_
12d50 75 75 69 64 28 26 75 75 69 64 2c 20 2d 31 2c 20  uuid(&uuid, -1, 
12d60 22 2a 22 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  "*");.  if( rc==
12d70 31 20 29 7b 0a 20 20 20 20 69 66 28 20 76 61 6c  1 ){.    if( val
12d80 69 64 61 74 65 31 36 28 7a 4e 61 6d 65 2c 20 6e  idate16(zName, n
12d90 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 69 66  Len) ){.      if
12da0 28 20 64 62 5f 65 78 69 73 74 73 28 22 53 45 4c  ( db_exists("SEL
12db0 45 43 54 20 31 20 46 52 4f 4d 20 74 69 63 6b 65  ECT 1 FROM ticke
12dc0 74 20 57 48 45 52 45 20 74 6b 74 5f 75 75 69 64  t WHERE tkt_uuid
12dd0 20 47 4c 4f 42 20 27 25 71 2a 27 22 2c 20 7a 4e   GLOB '%q*'", zN
12de0 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
12df0 74 6b 74 76 69 65 77 5f 70 61 67 65 28 29 3b 0a  tktview_page();.
12e00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
12e10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
12e20 28 20 64 62 5f 65 78 69 73 74 73 28 22 53 45 4c  ( db_exists("SEL
12e30 45 43 54 20 31 20 46 52 4f 4d 20 74 61 67 22 0a  ECT 1 FROM tag".
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e50 20 20 20 20 22 20 57 48 45 52 45 20 74 61 67 6e      " WHERE tagn
12e60 61 6d 65 20 47 4c 4f 42 20 27 65 76 65 6e 74 2d  ame GLOB 'event-
12e70 25 71 2a 27 22 2c 20 7a 4e 61 6d 65 29 20 29 7b  %q*'", zName) ){
12e80 0a 20 20 20 20 20 20 20 20 65 76 65 6e 74 5f 70  .        event_p
12e90 61 67 65 28 29 3b 0a 20 20 20 20 20 20 20 20 72  age();.        r
12ea0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
12eb0 20 20 20 7d 0a 20 20 20 20 73 74 79 6c 65 5f 68     }.    style_h
12ec0 65 61 64 65 72 28 22 4e 6f 20 53 75 63 68 20 4f  eader("No Such O
12ed0 62 6a 65 63 74 22 29 3b 0a 20 20 20 20 40 20 3c  bject");.    @ <
12ee0 70 3e 4e 6f 20 73 75 63 68 20 6f 62 6a 65 63 74  p>No such object
12ef0 3a 20 25 68 28 7a 4e 61 6d 65 29 3c 2f 70 3e 0a  : %h(zName)</p>.
12f00 20 20 20 20 69 66 28 20 6e 4c 65 6e 3c 34 20 29      if( nLen<4 )
12f10 7b 0a 20 20 20 20 20 20 40 20 3c 70 3e 4f 62 6a  {.      @ <p>Obj
12f20 65 63 74 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20  ect name should 
12f30 62 65 20 6e 6f 20 6c 65 73 73 20 74 68 61 6e 20  be no less than 
12f40 34 20 63 68 61 72 61 63 74 65 72 73 2e 20 20 54  4 characters.  T
12f50 65 6e 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20  en or more.     
12f60 20 40 20 63 68 61 72 61 63 74 65 72 73 20 61 72   @ characters ar
12f70 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 2e 3c 2f  e recommended.</
12f80 70 3e 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 79  p>.    }.    sty
12f90 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 20 20 20  le_footer();.   
12fa0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65   return;.  }else
12fb0 20 69 66 28 20 72 63 3d 3d 32 20 29 7b 0a 20 20   if( rc==2 ){.  
12fc0 20 20 63 67 69 5f 73 65 74 5f 70 61 72 61 6d 65    cgi_set_parame
12fd0 74 65 72 28 22 73 72 63 22 2c 22 69 6e 66 6f 22  ter("src","info"
12fe0 29 3b 0a 20 20 20 20 61 6d 62 69 67 75 6f 75 73  );.    ambiguous
12ff0 5f 70 61 67 65 28 29 3b 0a 20 20 20 20 72 65 74  _page();.    ret
13000 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 4e 61 6d 65  urn;.  }.  zName
13010 20 3d 20 62 6c 6f 62 5f 73 74 72 28 26 75 75 69   = blob_str(&uui
13020 64 29 3b 0a 20 20 72 69 64 20 3d 20 64 62 5f 69  d);.  rid = db_i
13030 6e 74 28 30 2c 20 22 53 45 4c 45 43 54 20 72 69  nt(0, "SELECT ri
13040 64 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52  d FROM blob WHER
13050 45 20 75 75 69 64 3d 25 51 22 2c 20 7a 4e 61 6d  E uuid=%Q", zNam
13060 65 29 3b 0a 20 20 69 66 28 20 72 69 64 3d 3d 30  e);.  if( rid==0
13070 20 29 7b 0a 20 20 20 20 73 74 79 6c 65 5f 68 65   ){.    style_he
13080 61 64 65 72 28 22 42 72 6f 6b 65 6e 20 4c 69 6e  ader("Broken Lin
13090 6b 22 29 3b 0a 20 20 20 20 40 20 3c 70 3e 4e 6f  k");.    @ <p>No
130a0 20 73 75 63 68 20 6f 62 6a 65 63 74 3a 20 25 68   such object: %h
130b0 28 7a 4e 61 6d 65 29 3c 2f 70 3e 0a 20 20 20 20  (zName)</p>.    
130c0 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a  style_footer();.
130d0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
130e0 20 20 69 66 28 20 64 62 5f 65 78 69 73 74 73 28    if( db_exists(
130f0 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 6d  "SELECT 1 FROM m
13100 6c 69 6e 6b 20 57 48 45 52 45 20 6d 69 64 3d 25  link WHERE mid=%
13110 64 22 2c 20 72 69 64 29 20 29 7b 0a 20 20 20 20  d", rid) ){.    
13120 63 69 5f 70 61 67 65 28 29 3b 0a 20 20 7d 65 6c  ci_page();.  }el
13130 73 65 0a 20 20 69 66 28 20 64 62 5f 65 78 69 73  se.  if( db_exis
13140 74 73 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f  ts("SELECT 1 FRO
13150 4d 20 74 61 67 78 72 65 66 20 4a 4f 49 4e 20 74  M tagxref JOIN t
13160 61 67 20 55 53 49 4e 47 28 74 61 67 69 64 29 22  ag USING(tagid)"
13170 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13180 20 22 20 57 48 45 52 45 20 72 69 64 3d 25 64 20   " WHERE rid=%d 
13190 41 4e 44 20 74 61 67 6e 61 6d 65 20 4c 49 4b 45  AND tagname LIKE
131a0 20 27 77 69 6b 69 2d 25 25 27 22 2c 20 72 69 64   'wiki-%%'", rid
131b0 29 20 29 7b 0a 20 20 20 20 77 69 6e 66 6f 5f 70  ) ){.    winfo_p
131c0 61 67 65 28 29 3b 0a 20 20 7d 65 6c 73 65 0a 20  age();.  }else. 
131d0 20 69 66 28 20 64 62 5f 65 78 69 73 74 73 28 22   if( db_exists("
131e0 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 74 61  SELECT 1 FROM ta
131f0 67 78 72 65 66 20 4a 4f 49 4e 20 74 61 67 20 55  gxref JOIN tag U
13200 53 49 4e 47 28 74 61 67 69 64 29 22 0a 20 20 20  SING(tagid)".   
13210 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
13220 48 45 52 45 20 72 69 64 3d 25 64 20 41 4e 44 20  HERE rid=%d AND 
13230 74 61 67 6e 61 6d 65 20 4c 49 4b 45 20 27 74 6b  tagname LIKE 'tk
13240 74 2d 25 25 27 22 2c 20 72 69 64 29 20 29 7b 0a  t-%%'", rid) ){.
13250 20 20 20 20 74 69 6e 66 6f 5f 70 61 67 65 28 29      tinfo_page()
13260 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20  ;.  }else.  if( 
13270 64 62 5f 65 78 69 73 74 73 28 22 53 45 4c 45 43  db_exists("SELEC
13280 54 20 31 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57  T 1 FROM plink W
13290 48 45 52 45 20 63 69 64 3d 25 64 22 2c 20 72 69  HERE cid=%d", ri
132a0 64 29 20 29 7b 0a 20 20 20 20 63 69 5f 70 61 67  d) ){.    ci_pag
132b0 65 28 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69  e();.  }else.  i
132c0 66 28 20 64 62 5f 65 78 69 73 74 73 28 22 53 45  f( db_exists("SE
132d0 4c 45 43 54 20 31 20 46 52 4f 4d 20 70 6c 69 6e  LECT 1 FROM plin
132e0 6b 20 57 48 45 52 45 20 70 69 64 3d 25 64 22 2c  k WHERE pid=%d",
132f0 20 72 69 64 29 20 29 7b 0a 20 20 20 20 63 69 5f   rid) ){.    ci_
13300 70 61 67 65 28 29 3b 0a 20 20 7d 65 6c 73 65 0a  page();.  }else.
13310 20 20 69 66 28 20 64 62 5f 65 78 69 73 74 73 28    if( db_exists(
13320 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 61  "SELECT 1 FROM a
13330 74 74 61 63 68 6d 65 6e 74 20 57 48 45 52 45 20  ttachment WHERE 
13340 61 74 74 61 63 68 69 64 3d 25 64 22 2c 20 72 69  attachid=%d", ri
13350 64 29 20 29 7b 0a 20 20 20 20 61 69 6e 66 6f 5f  d) ){.    ainfo_
13360 70 61 67 65 28 29 3b 0a 20 20 7d 65 6c 73 65 0a  page();.  }else.
13370 20 20 69 66 28 20 64 62 5f 74 61 62 6c 65 5f 65    if( db_table_e
13380 78 69 73 74 73 28 22 72 65 70 6f 73 69 74 6f 72  xists("repositor
13390 79 22 2c 22 66 6f 72 75 6d 70 6f 73 74 22 29 0a  y","forumpost").
133a0 20 20 20 26 26 20 64 62 5f 65 78 69 73 74 73 28     && db_exists(
133b0 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 66  "SELECT 1 FROM f
133c0 6f 72 75 6d 70 6f 73 74 20 57 48 45 52 45 20 66  orumpost WHERE f
133d0 70 69 64 3d 25 64 22 2c 20 72 69 64 29 0a 20 20  pid=%d", rid).  
133e0 29 7b 0a 20 20 20 20 66 6f 72 75 6d 74 68 72 65  ){.    forumthre
133f0 61 64 5f 70 61 67 65 28 29 3b 0a 20 20 7d 65 6c  ad_page();.  }el
13400 73 65 0a 20 20 7b 0a 20 20 20 20 61 72 74 69 66  se.  {.    artif
13410 61 63 74 5f 70 61 67 65 28 29 3b 0a 20 20 7d 0a  act_page();.  }.
13420 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f  }../*.** Do a co
13430 6d 6d 65 6e 74 20 63 6f 6d 70 61 72 69 73 6f 6e  mment comparison
13440 2e 0a 2a 2a 0a 2a 2a 20 2b 20 20 4c 65 61 64 69  ..**.** +  Leadi
13450 6e 67 20 61 6e 64 20 74 72 61 69 6c 69 6e 67 20  ng and trailing 
13460 77 68 69 74 65 73 70 61 63 65 20 61 72 65 20 69  whitespace are i
13470 67 6e 6f 72 65 64 2e 0a 2a 2a 20 2b 20 20 5c 72  gnored..** +  \r
13480 5c 6e 20 63 68 61 72 61 63 74 65 72 73 20 63 6f  \n characters co
13490 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 5c  mpare equal to \
134a0 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  n.**.** Return t
134b0 72 75 65 20 69 66 20 65 71 75 61 6c 20 61 6e 64  rue if equal and
134c0 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 65 71   false if not eq
134d0 75 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ual..*/.static i
134e0 6e 74 20 63 6f 6d 6d 65 6e 74 5f 63 6f 6d 70 61  nt comment_compa
134f0 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  re(const char *z
13500 41 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  A, const char *z
13510 42 29 7b 0a 20 20 69 66 28 20 7a 41 3d 3d 30 20  B){.  if( zA==0 
13520 29 20 7a 41 20 3d 20 22 22 3b 0a 20 20 69 66 28  ) zA = "";.  if(
13530 20 7a 42 3d 3d 30 20 29 20 7a 42 20 3d 20 22 22   zB==0 ) zB = ""
13540 3b 0a 20 20 77 68 69 6c 65 28 20 66 6f 73 73 69  ;.  while( fossi
13550 6c 5f 69 73 73 70 61 63 65 28 7a 41 5b 30 5d 29  l_isspace(zA[0])
13560 20 29 20 7a 41 2b 2b 3b 0a 20 20 77 68 69 6c 65   ) zA++;.  while
13570 28 20 66 6f 73 73 69 6c 5f 69 73 73 70 61 63 65  ( fossil_isspace
13580 28 7a 42 5b 30 5d 29 20 29 20 7a 42 2b 2b 3b 0a  (zB[0]) ) zB++;.
13590 20 20 77 68 69 6c 65 28 20 7a 41 5b 30 5d 20 26    while( zA[0] &
135a0 26 20 7a 42 5b 30 5d 20 29 7b 0a 20 20 20 20 69  & zB[0] ){.    i
135b0 66 28 20 7a 41 5b 30 5d 3d 3d 7a 42 5b 30 5d 20  f( zA[0]==zB[0] 
135c0 29 7b 20 7a 41 2b 2b 3b 20 7a 42 2b 2b 3b 20 63  ){ zA++; zB++; c
135d0 6f 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20 69  ontinue; }.    i
135e0 66 28 20 7a 41 5b 30 5d 3d 3d 27 5c 72 27 20 26  f( zA[0]=='\r' &
135f0 26 20 7a 41 5b 31 5d 3d 3d 27 5c 6e 27 20 26 26  & zA[1]=='\n' &&
13600 20 7a 42 5b 30 5d 3d 3d 27 5c 6e 27 20 29 7b 0a   zB[0]=='\n' ){.
13610 20 20 20 20 20 20 7a 41 20 2b 3d 20 32 3b 0a 20        zA += 2;. 
13620 20 20 20 20 20 7a 42 2b 2b 3b 0a 20 20 20 20 20       zB++;.     
13630 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
13640 0a 20 20 20 20 69 66 28 20 7a 42 5b 30 5d 3d 3d  .    if( zB[0]==
13650 27 5c 72 27 20 26 26 20 7a 42 5b 31 5d 3d 3d 27  '\r' && zB[1]=='
13660 5c 6e 27 20 26 26 20 7a 41 5b 30 5d 3d 3d 27 5c  \n' && zA[0]=='\
13670 6e 27 20 29 7b 0a 20 20 20 20 20 20 7a 42 20 2b  n' ){.      zB +
13680 3d 20 32 3b 0a 20 20 20 20 20 20 7a 41 2b 2b 3b  = 2;.      zA++;
13690 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
136a0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
136b0 6e 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  n 0;.  }.  while
136c0 28 20 66 6f 73 73 69 6c 5f 69 73 73 70 61 63 65  ( fossil_isspace
136d0 28 7a 42 5b 30 5d 29 20 29 20 7a 42 2b 2b 3b 0a  (zB[0]) ) zB++;.
136e0 20 20 77 68 69 6c 65 28 20 66 6f 73 73 69 6c 5f    while( fossil_
136f0 69 73 73 70 61 63 65 28 7a 41 5b 30 5d 29 20 29  isspace(zA[0]) )
13700 20 7a 41 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20   zA++;.  return 
13710 7a 41 5b 30 5d 3d 3d 30 20 26 26 20 7a 42 5b 30  zA[0]==0 && zB[0
13720 5d 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ]==0;.}../*.** T
13730 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 74  he following met
13740 68 6f 64 73 20 6f 70 65 72 61 74 65 20 6f 6e 20  hods operate on 
13750 74 68 65 20 6e 65 77 74 61 67 73 20 74 65 6d 70  the newtags temp
13760 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 74  orary table.** t
13770 68 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 63  hat is used to c
13780 6f 6c 6c 65 63 74 20 76 61 72 69 6f 75 73 20 63  ollect various c
13790 68 61 6e 67 65 73 20 74 6f 20 62 65 20 61 64 64  hanges to be add
137a0 65 64 20 74 6f 20 61 20 63 6f 6e 74 72 6f 6c 0a  ed to a control.
137b0 2a 2a 20 61 72 74 69 66 61 63 74 20 66 6f 72 20  ** artifact for 
137c0 61 20 63 68 65 63 6b 2d 69 6e 20 65 64 69 74 2e  a check-in edit.
137d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
137e0 69 6e 69 74 5f 6e 65 77 74 61 67 73 28 76 6f 69  init_newtags(voi
137f0 64 29 7b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65  d){.  db_multi_e
13800 78 65 63 28 22 43 52 45 41 54 45 20 54 45 4d 50  xec("CREATE TEMP
13810 20 54 41 42 4c 45 20 6e 65 77 74 61 67 73 28 74   TABLE newtags(t
13820 61 67 20 55 4e 49 51 55 45 2c 20 70 72 65 66 69  ag UNIQUE, prefi
13830 78 2c 20 76 61 6c 75 65 29 22 29 3b 0a 7d 0a 0a  x, value)");.}..
13840 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 61 6e  static void chan
13850 67 65 5f 73 70 65 63 69 61 6c 28 0a 20 20 63 6f  ge_special(.  co
13860 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
13870 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
13880 68 65 20 73 70 65 63 69 61 6c 20 74 61 67 20 2a  he special tag *
13890 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
138a0 7a 4f 70 2c 20 20 20 20 20 20 2f 2a 20 4f 70 65  zOp,      /* Ope
138b0 72 61 74 69 6f 6e 20 70 72 65 66 69 78 20 28 65  ration prefix (e
138c0 2e 67 2e 20 2b 2c 2d 2c 2a 29 20 2a 2f 0a 20 20  .g. +,-,*) */.  
138d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c  const char *zVal
138e0 75 65 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f  ue    /* Value o
138f0 66 20 74 68 65 20 74 61 67 20 2a 2f 0a 29 7b 0a  f the tag */.){.
13900 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
13910 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 6e 65  "REPLACE INTO ne
13920 77 74 61 67 73 20 56 41 4c 55 45 53 28 25 51 2c  wtags VALUES(%Q,
13930 27 25 71 27 2c 25 51 29 22 2c 20 7a 4e 61 6d 65  '%q',%Q)", zName
13940 2c 20 7a 4f 70 2c 20 7a 56 61 6c 75 65 29 3b 0a  , zOp, zValue);.
13950 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  }..static void c
13960 68 61 6e 67 65 5f 73 79 6d 5f 74 61 67 28 63 6f  hange_sym_tag(co
13970 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 67 2c 20  nst char *zTag, 
13980 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 29  const char *zOp)
13990 7b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65  {.  db_multi_exe
139a0 63 28 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20  c("REPLACE INTO 
139b0 6e 65 77 74 61 67 73 20 56 41 4c 55 45 53 28 27  newtags VALUES('
139c0 73 79 6d 2d 25 71 27 2c 25 51 2c 4e 55 4c 4c 29  sym-%q',%Q,NULL)
139d0 22 2c 20 7a 54 61 67 2c 20 7a 4f 70 29 3b 0a 7d  ", zTag, zOp);.}
139e0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61  ..static void ca
139f0 6e 63 65 6c 5f 73 70 65 63 69 61 6c 28 63 6f 6e  ncel_special(con
13a00 73 74 20 63 68 61 72 20 2a 7a 54 61 67 29 7b 0a  st char *zTag){.
13a10 20 20 63 68 61 6e 67 65 5f 73 70 65 63 69 61 6c    change_special
13a20 28 7a 54 61 67 2c 22 2d 22 2c 30 29 3b 0a 7d 0a  (zTag,"-",0);.}.
13a30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64  .static void add
13a40 5f 63 6f 6c 6f 72 28 63 6f 6e 73 74 20 63 68 61  _color(const cha
13a50 72 20 2a 7a 4e 65 77 43 6f 6c 6f 72 2c 20 69 6e  r *zNewColor, in
13a60 74 20 66 50 72 6f 70 61 67 61 74 65 43 6f 6c 6f  t fPropagateColo
13a70 72 29 7b 0a 20 20 63 68 61 6e 67 65 5f 73 70 65  r){.  change_spe
13a80 63 69 61 6c 28 22 62 67 63 6f 6c 6f 72 22 2c 66  cial("bgcolor",f
13a90 50 72 6f 70 61 67 61 74 65 43 6f 6c 6f 72 20 3f  PropagateColor ?
13aa0 20 22 2a 22 20 3a 20 22 2b 22 2c 20 7a 4e 65 77   "*" : "+", zNew
13ab0 43 6f 6c 6f 72 29 3b 0a 7d 0a 0a 73 74 61 74 69  Color);.}..stati
13ac0 63 20 76 6f 69 64 20 63 61 6e 63 65 6c 5f 63 6f  c void cancel_co
13ad0 6c 6f 72 28 76 6f 69 64 29 7b 0a 20 20 63 68 61  lor(void){.  cha
13ae0 6e 67 65 5f 73 70 65 63 69 61 6c 28 22 62 67 63  nge_special("bgc
13af0 6f 6c 6f 72 22 2c 22 2d 22 2c 30 29 3b 0a 7d 0a  olor","-",0);.}.
13b00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64  .static void add
13b10 5f 63 6f 6d 6d 65 6e 74 28 63 6f 6e 73 74 20 63  _comment(const c
13b20 68 61 72 20 2a 7a 4e 65 77 43 6f 6d 6d 65 6e 74  har *zNewComment
13b30 29 7b 0a 20 20 63 68 61 6e 67 65 5f 73 70 65 63  ){.  change_spec
13b40 69 61 6c 28 22 63 6f 6d 6d 65 6e 74 22 2c 22 2b  ial("comment","+
13b50 22 2c 7a 4e 65 77 43 6f 6d 6d 65 6e 74 29 3b 0a  ",zNewComment);.
13b60 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  }..static void a
13b70 64 64 5f 64 61 74 65 28 63 6f 6e 73 74 20 63 68  dd_date(const ch
13b80 61 72 20 2a 7a 4e 65 77 44 61 74 65 29 7b 0a 20  ar *zNewDate){. 
13b90 20 63 68 61 6e 67 65 5f 73 70 65 63 69 61 6c 28   change_special(
13ba0 22 64 61 74 65 22 2c 22 2b 22 2c 7a 4e 65 77 44  "date","+",zNewD
13bb0 61 74 65 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ate);.}..static 
13bc0 76 6f 69 64 20 61 64 64 5f 75 73 65 72 28 63 6f  void add_user(co
13bd0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 55 73  nst char *zNewUs
13be0 65 72 29 7b 0a 20 20 63 68 61 6e 67 65 5f 73 70  er){.  change_sp
13bf0 65 63 69 61 6c 28 22 75 73 65 72 22 2c 22 2b 22  ecial("user","+"
13c00 2c 7a 4e 65 77 55 73 65 72 29 3b 0a 7d 0a 0a 73  ,zNewUser);.}..s
13c10 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 5f 74  tatic void add_t
13c20 61 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ag(const char *z
13c30 4e 65 77 54 61 67 29 7b 0a 20 20 63 68 61 6e 67  NewTag){.  chang
13c40 65 5f 73 79 6d 5f 74 61 67 28 7a 4e 65 77 54 61  e_sym_tag(zNewTa
13c50 67 2c 22 2b 22 29 3b 0a 7d 0a 0a 73 74 61 74 69  g,"+");.}..stati
13c60 63 20 76 6f 69 64 20 63 61 6e 63 65 6c 5f 74 61  c void cancel_ta
13c70 67 28 69 6e 74 20 72 69 64 2c 20 63 6f 6e 73 74  g(int rid, const
13c80 20 63 68 61 72 20 2a 7a 43 61 6e 63 65 6c 54 61   char *zCancelTa
13c90 67 29 7b 0a 20 20 69 66 28 20 64 62 5f 65 78 69  g){.  if( db_exi
13ca0 73 74 73 28 22 53 45 4c 45 43 54 20 31 20 46 52  sts("SELECT 1 FR
13cb0 4f 4d 20 74 61 67 78 72 65 66 2c 20 74 61 67 22  OM tagxref, tag"
13cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13cd0 20 22 20 57 48 45 52 45 20 74 61 67 78 72 65 66   " WHERE tagxref
13ce0 2e 72 69 64 3d 25 64 20 41 4e 44 20 74 61 67 74  .rid=%d AND tagt
13cf0 79 70 65 3e 30 22 0a 20 20 20 20 20 20 20 20 20  ype>0".         
13d00 20 20 20 20 20 20 20 22 20 20 20 41 4e 44 20 74         "   AND t
13d10 61 67 78 72 65 66 2e 74 61 67 69 64 3d 74 61 67  agxref.tagid=tag
13d20 2e 74 61 67 69 64 20 41 4e 44 20 74 61 67 6e 61  .tagid AND tagna
13d30 6d 65 3d 27 73 79 6d 2d 25 71 27 22 2c 0a 20 20  me='sym-%q'",.  
13d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 69                ri
13d50 64 2c 20 7a 43 61 6e 63 65 6c 54 61 67 29 0a 20  d, zCancelTag). 
13d60 20 29 20 63 68 61 6e 67 65 5f 73 79 6d 5f 74 61   ) change_sym_ta
13d70 67 28 7a 43 61 6e 63 65 6c 54 61 67 2c 22 2d 22  g(zCancelTag,"-"
13d80 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
13d90 64 20 68 69 64 65 5f 62 72 61 6e 63 68 28 76 6f  d hide_branch(vo
13da0 69 64 29 7b 0a 20 20 63 68 61 6e 67 65 5f 73 70  id){.  change_sp
13db0 65 63 69 61 6c 28 22 68 69 64 64 65 6e 22 2c 22  ecial("hidden","
13dc0 2a 22 2c 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  *",0);.}..static
13dd0 20 76 6f 69 64 20 63 6c 6f 73 65 5f 6c 65 61 66   void close_leaf
13de0 28 69 6e 74 20 72 69 64 29 7b 0a 20 20 63 68 61  (int rid){.  cha
13df0 6e 67 65 5f 73 70 65 63 69 61 6c 28 22 63 6c 6f  nge_special("clo
13e00 73 65 64 22 2c 69 73 5f 61 5f 6c 65 61 66 28 72  sed",is_a_leaf(r
13e10 69 64 29 3f 22 2b 22 3a 22 2a 22 2c 30 29 3b 0a  id)?"+":"*",0);.
13e20 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  }..static void c
13e30 68 61 6e 67 65 5f 62 72 61 6e 63 68 28 69 6e 74  hange_branch(int
13e40 20 72 69 64 2c 20 63 6f 6e 73 74 20 63 68 61 72   rid, const char
13e50 20 2a 7a 4e 65 77 42 72 61 6e 63 68 29 7b 0a 20   *zNewBranch){. 
13e60 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a   db_multi_exec(.
13e70 20 20 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54      "REPLACE INT
13e80 4f 20 6e 65 77 74 61 67 73 20 22 0a 20 20 20 20  O newtags ".    
13e90 22 20 53 45 4c 45 43 54 20 74 61 67 6e 61 6d 65  " SELECT tagname
13ea0 2c 20 27 2d 27 2c 20 4e 55 4c 4c 20 46 52 4f 4d  , '-', NULL FROM
13eb0 20 74 61 67 78 72 65 66 2c 20 74 61 67 22 0a 20   tagxref, tag". 
13ec0 20 20 20 22 20 20 57 48 45 52 45 20 74 61 67 78     "  WHERE tagx
13ed0 72 65 66 2e 72 69 64 3d 25 64 20 41 4e 44 20 74  ref.rid=%d AND t
13ee0 61 67 74 79 70 65 3d 3d 32 22 0a 20 20 20 20 22  agtype==2".    "
13ef0 20 20 20 20 41 4e 44 20 74 61 67 6e 61 6d 65 20      AND tagname 
13f00 47 4c 4f 42 20 27 73 79 6d 2d 2a 27 22 0a 20 20  GLOB 'sym-*'".  
13f10 20 20 22 20 20 20 20 41 4e 44 20 74 61 67 2e 74    "    AND tag.t
13f20 61 67 69 64 3d 74 61 67 78 72 65 66 2e 74 61 67  agid=tagxref.tag
13f30 69 64 22 2c 0a 20 20 20 20 72 69 64 0a 20 20 29  id",.    rid.  )
13f40 3b 0a 20 20 63 68 61 6e 67 65 5f 73 70 65 63 69  ;.  change_speci
13f50 61 6c 28 22 62 72 61 6e 63 68 22 2c 22 2a 22 2c  al("branch","*",
13f60 7a 4e 65 77 42 72 61 6e 63 68 29 3b 0a 20 20 63  zNewBranch);.  c
13f70 68 61 6e 67 65 5f 73 79 6d 5f 74 61 67 28 7a 4e  hange_sym_tag(zN
13f80 65 77 42 72 61 6e 63 68 2c 22 2a 22 29 3b 0a 7d  ewBranch,"*");.}
13f90 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 70 70 6c  ../*.** The appl
13fa0 79 5f 6e 65 77 74 61 67 73 20 6d 65 74 68 6f 64  y_newtags method
13fb0 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
13fc0 20 61 6c 6c 20 6e 65 77 74 61 67 73 20 68 61 76   all newtags hav
13fd0 65 20 62 65 65 6e 20 61 64 64 65 64 0a 2a 2a 20  e been added.** 
13fe0 61 6e 64 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20  and the control 
13ff0 61 72 74 69 66 61 63 74 20 69 73 20 63 6f 6d 70  artifact is comp
14000 6c 65 74 65 64 20 61 6e 64 20 74 68 65 6e 20 77  leted and then w
14010 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 44 42  ritten to the DB
14020 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14030 20 61 70 70 6c 79 5f 6e 65 77 74 61 67 73 28 0a   apply_newtags(.
14040 20 20 42 6c 6f 62 20 2a 63 74 72 6c 2c 0a 20 20    Blob *ctrl,.  
14050 69 6e 74 20 72 69 64 2c 0a 20 20 63 6f 6e 73 74  int rid,.  const
14060 20 63 68 61 72 20 2a 7a 55 75 69 64 2c 0a 20 20   char *zUuid,.  
14070 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 65  const char *zUse
14080 72 4f 76 72 64 2c 20 20 2f 2a 20 54 68 65 20 75  rOvrd,  /* The u
14090 73 65 72 20 6e 61 6d 65 20 6f 6e 20 74 68 65 20  ser name on the 
140a0 63 6f 6e 74 72 6f 6c 20 61 72 74 69 66 61 63 74  control artifact
140b0 20 2a 2f 0a 20 20 69 6e 74 20 66 44 72 79 52 75   */.  int fDryRu
140c0 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n             /*
140d0 20 50 72 69 6e 74 20 63 6f 6e 74 72 6f 6c 20 61   Print control a
140e0 72 74 69 66 61 63 74 2c 20 62 75 74 20 6d 61 6b  rtifact, but mak
140f0 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 2a 2f 0a  e no changes */.
14100 29 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 69  ){.  Stmt q;.  i
14110 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 0a 20  nt nChng = 0;.. 
14120 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20   db_prepare(&q, 
14130 22 53 45 4c 45 43 54 20 74 61 67 2c 20 70 72 65  "SELECT tag, pre
14140 66 69 78 2c 20 76 61 6c 75 65 20 46 52 4f 4d 20  fix, value FROM 
14150 6e 65 77 74 61 67 73 22 0a 20 20 20 20 20 20 20  newtags".       
14160 20 20 20 20 20 20 20 20 20 20 22 20 4f 52 44 45            " ORDE
14170 52 20 42 59 20 70 72 65 66 69 78 20 7c 7c 20 74  R BY prefix || t
14180 61 67 22 29 3b 0a 20 20 77 68 69 6c 65 28 20 64  ag");.  while( d
14190 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49  b_step(&q)==SQLI
141a0 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f  TE_ROW ){.    co
141b0 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 67 20 3d  nst char *zTag =
141c0 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28   db_column_text(
141d0 26 71 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73  &q, 0);.    cons
141e0 74 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78 20  t char *zPrefix 
141f0 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
14200 28 26 71 2c 20 31 29 3b 0a 20 20 20 20 63 6f 6e  (&q, 1);.    con
14210 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 20  st char *zValue 
14220 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
14230 28 26 71 2c 20 32 29 3b 0a 20 20 20 20 6e 43 68  (&q, 2);.    nCh
14240 6e 67 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 56  ng++;.    if( zV
14250 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 62 6c  alue ){.      bl
14260 6f 62 5f 61 70 70 65 6e 64 66 28 63 74 72 6c 2c  ob_appendf(ctrl,
14270 20 22 54 20 25 73 25 46 20 25 73 20 25 46 5c 6e   "T %s%F %s %F\n
14280 22 2c 20 7a 50 72 65 66 69 78 2c 20 7a 54 61 67  ", zPrefix, zTag
14290 2c 20 7a 55 75 69 64 2c 20 7a 56 61 6c 75 65 29  , zUuid, zValue)
142a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
142b0 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
142c0 63 74 72 6c 2c 20 22 54 20 25 73 25 46 20 25 73  ctrl, "T %s%F %s
142d0 5c 6e 22 2c 20 7a 50 72 65 66 69 78 2c 20 7a 54  \n", zPrefix, zT
142e0 61 67 2c 20 7a 55 75 69 64 29 3b 0a 20 20 20 20  ag, zUuid);.    
142f0 7d 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c  }.  }.  db_final
14300 69 7a 65 28 26 71 29 3b 0a 20 20 69 66 28 20 6e  ize(&q);.  if( n
14310 43 68 6e 67 3e 30 20 29 7b 0a 20 20 20 20 69 6e  Chng>0 ){.    in
14320 74 20 6e 72 69 64 3b 0a 20 20 20 20 42 6c 6f 62  t nrid;.    Blob
14330 20 63 6b 73 75 6d 3b 0a 20 20 20 20 69 66 28 20   cksum;.    if( 
14340 7a 55 73 65 72 4f 76 72 64 20 26 26 20 7a 55 73  zUserOvrd && zUs
14350 65 72 4f 76 72 64 5b 30 5d 20 29 7b 0a 20 20 20  erOvrd[0] ){.   
14360 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
14370 63 74 72 6c 2c 20 22 55 20 25 46 5c 6e 22 2c 20  ctrl, "U %F\n", 
14380 7a 55 73 65 72 4f 76 72 64 29 3b 0a 20 20 20 20  zUserOvrd);.    
14390 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 6c 6f  }else{.      blo
143a0 62 5f 61 70 70 65 6e 64 66 28 63 74 72 6c 2c 20  b_appendf(ctrl, 
143b0 22 55 20 25 46 5c 6e 22 2c 20 6c 6f 67 69 6e 5f  "U %F\n", login_
143c0 6e 61 6d 65 28 29 29 3b 0a 20 20 20 20 7d 0a 20  name());.    }. 
143d0 20 20 20 6d 64 35 73 75 6d 5f 62 6c 6f 62 28 63     md5sum_blob(c
143e0 74 72 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  trl, &cksum);.  
143f0 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 63    blob_appendf(c
14400 74 72 6c 2c 20 22 5a 20 25 62 5c 6e 22 2c 20 26  trl, "Z %b\n", &
14410 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  cksum);.    if( 
14420 66 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 20  fDryRun ){.     
14430 20 61 73 73 65 72 74 28 20 67 2e 69 73 48 54 54   assert( g.isHTT
14440 50 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20  P==0 ); /* Only 
14450 70 72 69 6e 74 20 63 6f 6e 74 72 6f 6c 20 61 72  print control ar
14460 74 69 66 61 63 74 20 69 6e 20 63 6f 6e 73 6f 6c  tifact in consol
14470 65 20 6d 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20  e mode. */.     
14480 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 25   fossil_print("%
14490 73 22 2c 20 62 6c 6f 62 5f 73 74 72 28 63 74 72  s", blob_str(ctr
144a0 6c 29 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f  l));.      blob_
144b0 72 65 73 65 74 28 63 74 72 6c 29 3b 0a 20 20 20  reset(ctrl);.   
144c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62   }else{.      db
144d0 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
144e0 6f 6e 28 29 3b 0a 20 20 20 20 20 20 67 2e 6d 61  on();.      g.ma
144f0 72 6b 50 72 69 76 61 74 65 20 3d 20 63 6f 6e 74  rkPrivate = cont
14500 65 6e 74 5f 69 73 5f 70 72 69 76 61 74 65 28 72  ent_is_private(r
14510 69 64 29 3b 0a 20 20 20 20 20 20 6e 72 69 64 20  id);.      nrid 
14520 3d 20 63 6f 6e 74 65 6e 74 5f 70 75 74 28 63 74  = content_put(ct
14530 72 6c 29 3b 0a 20 20 20 20 20 20 6d 61 6e 69 66  rl);.      manif
14540 65 73 74 5f 63 72 6f 73 73 6c 69 6e 6b 28 6e 72  est_crosslink(nr
14550 69 64 2c 20 63 74 72 6c 2c 20 4d 43 5f 50 45 52  id, ctrl, MC_PER
14560 4d 49 54 5f 48 4f 4f 4b 53 29 3b 0a 20 20 20 20  MIT_HOOKS);.    
14570 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63    db_end_transac
14580 74 69 6f 6e 28 30 29 3b 0a 20 20 20 20 7d 0a 20  tion(0);.    }. 
14590 20 20 20 61 73 73 65 72 74 28 20 62 6c 6f 62 5f     assert( blob_
145a0 69 73 5f 72 65 73 65 74 28 63 74 72 6c 29 20 29  is_reset(ctrl) )
145b0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
145c0 68 69 73 20 6d 65 74 68 6f 64 20 63 68 65 63 6b  his method check
145d0 73 20 74 68 61 74 20 74 68 65 20 64 61 74 65 20  s that the date 
145e0 63 61 6e 20 62 65 20 70 61 72 73 65 64 2e 0a 2a  can be parsed..*
145f0 2a 20 52 65 74 75 72 6e 73 20 31 20 69 66 20 64  * Returns 1 if d
14600 61 74 65 74 69 6d 65 28 29 20 63 61 6e 20 76 61  atetime() can va
14610 6c 69 64 61 74 65 2c 20 30 20 6f 74 68 65 72 77  lidate, 0 otherw
14620 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 69 73 5f 64  ise..*/.int is_d
14630 61 74 65 74 69 6d 65 28 63 6f 6e 73 74 20 63 68  atetime(const ch
14640 61 72 2a 20 7a 44 61 74 65 29 7b 0a 20 20 72 65  ar* zDate){.  re
14650 74 75 72 6e 20 64 62 5f 69 6e 74 28 30 2c 20 22  turn db_int(0, "
14660 53 45 4c 45 43 54 20 64 61 74 65 74 69 6d 65 28  SELECT datetime(
14670 25 51 29 20 4e 4f 54 20 4e 55 4c 4c 22 2c 20 7a  %Q) NOT NULL", z
14680 44 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Date);.}../*.** 
14690 57 45 42 50 41 47 45 3a 20 63 69 5f 65 64 69 74  WEBPAGE: ci_edit
146a0 0a 2a 2a 0a 2a 2a 20 45 64 69 74 20 61 20 63 68  .**.** Edit a ch
146b0 65 63 6b 2d 69 6e 2e 20 20 28 43 68 65 63 6b 2d  eck-in.  (Check-
146c0 69 6e 73 20 61 72 65 20 69 6d 6d 75 74 61 62 6c  ins are immutabl
146d0 65 20 61 6e 64 20 64 6f 20 6e 6f 74 20 72 65 61  e and do not rea
146e0 6c 6c 79 20 63 68 61 6e 67 65 2e 0a 2a 2a 20 54  lly change..** T
146f0 68 69 73 20 70 61 67 65 20 72 65 61 6c 6c 79 20  his page really 
14700 63 72 65 61 74 65 73 20 73 75 70 70 6c 65 6d 65  creates suppleme
14710 6e 74 61 6c 20 74 61 67 73 20 74 68 61 74 20 61  ntal tags that a
14720 66 66 65 63 74 20 74 68 65 20 64 69 73 70 6c 61  ffect the displa
14730 79 0a 2a 2a 20 6f 66 20 74 68 65 20 63 68 65 63  y.** of the chec
14740 6b 2d 69 6e 2e 29 0a 2a 2a 0a 2a 2a 20 51 75 65  k-in.).**.** Que
14750 72 79 20 70 61 72 6d 65 74 65 72 73 3a 0a 2a 2a  ry parmeters:.**
14760 0a 2a 2a 20 20 20 20 20 72 69 64 3d 49 4e 54 45  .**     rid=INTE
14770 47 45 52 20 20 20 20 20 20 20 20 52 65 63 6f 72  GER        Recor
14780 64 20 49 44 20 6f 66 20 74 68 65 20 63 68 65 63  d ID of the chec
14790 6b 2d 69 6e 20 74 6f 20 65 64 69 74 20 28 52 45  k-in to edit (RE
147a0 51 55 49 52 45 44 29 0a 2a 2a 0a 2a 2a 20 50 4f  QUIRED).**.** PO
147b0 53 54 20 70 61 72 61 6d 65 74 65 72 73 20 61 66  ST parameters af
147c0 74 65 72 20 70 72 65 73 73 69 6e 67 20 22 50 65  ter pressing "Pe
147d0 72 76 69 65 77 22 2c 20 22 43 61 6e 63 65 6c 22  rview", "Cancel"
147e0 2c 20 6f 72 20 22 41 70 70 6c 79 22 3a 0a 2a 2a  , or "Apply":.**
147f0 0a 2a 2a 20 20 20 20 20 63 3d 54 45 58 54 20 20  .**     c=TEXT  
14800 20 20 20 20 20 20 20 20 20 20 20 4e 65 77 20 63             New c
14810 68 65 63 6b 2d 69 6e 20 63 6f 6d 6d 65 6e 74 0a  heck-in comment.
14820 2a 2a 20 20 20 20 20 75 3d 54 45 58 54 20 20 20  **     u=TEXT   
14830 20 20 20 20 20 20 20 20 20 20 4e 65 77 20 75 73            New us
14840 65 72 20 6e 61 6d 65 0a 2a 2a 20 20 20 20 20 6e  er name.**     n
14850 65 77 63 6c 72 20 20 20 20 20 20 20 20 20 20 20  ewclr           
14860 20 20 41 70 70 6c 79 20 61 20 62 61 63 6b 67 72    Apply a backgr
14870 6f 75 6e 64 20 63 6f 6c 6f 72 0a 2a 2a 20 20 20  ound color.**   
14880 20 20 63 6c 72 3d 54 45 58 54 20 20 20 20 20 20    clr=TEXT      
14890 20 20 20 20 20 4e 65 77 20 62 61 63 6b 67 72 6f       New backgro
148a0 75 6e 64 20 63 6f 6c 6f 72 20 28 6f 6e 6c 79 20  und color (only 
148b0 69 66 20 6e 65 77 63 6c 72 29 0a 2a 2a 20 20 20  if newclr).**   
148c0 20 20 70 63 6c 72 20 20 20 20 20 20 20 20 20 20    pclr          
148d0 20 20 20 20 20 50 72 6f 70 61 67 61 74 65 20 6e       Propagate n
148e0 65 77 20 62 61 63 6b 67 72 6f 75 6e 64 20 63 6f  ew background co
148f0 6c 6f 72 20 28 6f 6e 6c 79 20 69 66 20 6e 65 77  lor (only if new
14900 63 6c 72 29 0a 2a 2a 20 20 20 20 20 64 74 3d 54  clr).**     dt=T
14910 45 58 54 20 20 20 20 20 20 20 20 20 20 20 20 4e  EXT            N
14920 65 77 20 63 68 65 63 6b 2d 69 6e 20 64 61 74 65  ew check-in date
14930 2f 74 69 6d 65 20 28 49 53 4f 38 36 31 30 20 66  /time (ISO8610 f
14940 6f 72 6d 61 74 29 0a 2a 2a 20 20 20 20 20 6e 65  ormat).**     ne
14950 77 74 61 67 20 20 20 20 20 20 20 20 20 20 20 20  wtag            
14960 20 41 64 64 20 61 20 6e 65 77 20 74 61 67 20 74   Add a new tag t
14970 6f 20 74 68 65 20 63 68 65 63 6b 2d 69 6e 0a 2a  o the check-in.*
14980 2a 20 20 20 20 20 74 61 67 6e 61 6d 65 3d 54 45  *     tagname=TE
14990 58 54 20 20 20 20 20 20 20 4e 61 6d 65 20 6f 66  XT       Name of
149a0 20 74 68 65 20 6e 65 77 20 74 61 67 20 74 6f 20   the new tag to 
149b0 62 65 20 61 64 64 65 64 20 28 6f 6e 6c 79 20 69  be added (only i
149c0 66 20 6e 65 77 74 61 67 29 0a 2a 2a 20 20 20 20  f newtag).**    
149d0 20 6e 65 77 62 72 20 20 20 20 20 20 20 20 20 20   newbr          
149e0 20 20 20 20 50 75 74 20 74 68 65 20 63 68 65 63      Put the chec
149f0 6b 2d 69 6e 20 6f 6e 20 61 20 6e 65 77 20 62 72  k-in on a new br
14a00 61 6e 63 68 0a 2a 2a 20 20 20 20 20 62 72 6e 61  anch.**     brna
14a10 6d 65 3d 54 45 58 54 20 20 20 20 20 20 20 20 4e  me=TEXT        N
14a20 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 62  ame of the new b
14a30 72 61 6e 63 68 20 28 6f 6e 6c 79 20 69 66 20 6e  ranch (only if n
14a40 65 77 62 72 29 0a 2a 2a 20 20 20 20 20 63 6c 6f  ewbr).**     clo
14a50 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
14a60 43 6c 6f 73 65 20 74 68 69 73 20 63 68 65 63 6b  Close this check
14a70 2d 69 6e 0a 2a 2a 20 20 20 20 20 68 69 64 65 20  -in.**     hide 
14a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 48 69                Hi
14a90 64 65 20 74 68 69 73 20 63 68 65 63 6b 2d 69 6e  de this check-in
14aa0 0a 2a 2a 20 20 20 20 20 63 4e 4e 4e 20 20 20 20  .**     cNNN    
14ab0 20 20 20 20 20 20 20 20 20 20 20 43 61 6e 63 65             Cance
14ac0 6c 20 74 61 67 20 77 69 74 68 20 74 61 67 69 64  l tag with tagid
14ad0 3d 4e 4e 4e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63  =NNN.**.**     c
14ae0 61 6e 63 65 6c 20 20 20 20 20 20 20 20 20 20 20  ancel           
14af0 20 20 43 61 6e 63 65 6c 20 74 68 65 20 65 64 69    Cancel the edi
14b00 74 2e 20 20 52 65 74 75 72 6e 20 74 6f 20 74 68  t.  Return to th
14b10 65 20 63 68 65 63 6b 2d 69 6e 20 76 69 65 77 0a  e check-in view.
14b20 2a 2a 20 20 20 20 20 70 72 65 76 69 65 77 20 20  **     preview  
14b30 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 61            Show a
14b40 20 70 72 65 76 69 65 77 20 6f 66 20 74 68 65 20   preview of the 
14b50 65 64 69 74 65 64 20 63 68 65 63 6b 2d 69 6e 20  edited check-in 
14b60 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 61  comment.**     a
14b70 70 70 6c 79 20 20 20 20 20 20 20 20 20 20 20 20  pply            
14b80 20 20 41 70 70 6c 79 20 63 68 61 6e 67 65 73 0a    Apply changes.
14b90 2a 2f 0a 76 6f 69 64 20 63 69 5f 65 64 69 74 5f  */.void ci_edit_
14ba0 70 61 67 65 28 76 6f 69 64 29 7b 0a 20 20 69 6e  page(void){.  in
14bb0 74 20 72 69 64 3b 0a 20 20 63 6f 6e 73 74 20 63  t rid;.  const c
14bc0 68 61 72 20 2a 7a 43 6f 6d 6d 65 6e 74 3b 20 20  har *zComment;  
14bd0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
14be0 74 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  t comment on the
14bf0 20 63 68 65 63 6b 2d 69 6e 20 2a 2f 0a 20 20 63   check-in */.  c
14c00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 43  onst char *zNewC
14c10 6f 6d 6d 65 6e 74 3b 20 20 20 20 20 20 2f 2a 20  omment;      /* 
14c20 52 65 76 69 73 65 64 20 63 68 65 63 6b 2d 69 6e  Revised check-in
14c30 20 63 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f   comment */.  co
14c40 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 65 72 3b  nst char *zUser;
14c50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
14c60 75 72 72 65 6e 74 20 75 73 65 72 20 66 6f 72 20  urrent user for 
14c70 74 68 65 20 63 68 65 63 6b 2d 69 6e 20 2a 2f 0a  the check-in */.
14c80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
14c90 65 77 55 73 65 72 3b 20 20 20 20 20 20 20 20 20  ewUser;         
14ca0 2f 2a 20 52 65 76 69 73 65 64 20 75 73 65 72 20  /* Revised user 
14cb0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
14cc0 2a 7a 44 61 74 65 3b 20 20 20 20 20 20 20 20 20  *zDate;         
14cd0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 64 61     /* Current da
14ce0 74 65 20 6f 66 20 74 68 65 20 63 68 65 63 6b 2d  te of the check-
14cf0 69 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  in */.  const ch
14d00 61 72 20 2a 7a 4e 65 77 44 61 74 65 3b 20 20 20  ar *zNewDate;   
14d10 20 20 20 20 20 20 2f 2a 20 52 65 76 69 73 65 64        /* Revised
14d20 20 63 68 65 63 6b 2d 69 6e 20 64 61 74 65 20 2a   check-in date *
14d30 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
14d40 7a 4e 65 77 43 6f 6c 6f 72 46 6c 61 67 3b 20 20  zNewColorFlag;  
14d50 20 20 2f 2a 20 22 63 68 65 63 6b 65 64 22 20 69    /* "checked" i
14d60 66 20 22 43 68 61 6e 67 65 20 63 6f 6c 6f 72 22  f "Change color"
14d70 20 69 73 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20   is checked */. 
14d80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
14d90 6c 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  lor;           /
14da0 2a 20 43 75 72 72 65 6e 74 20 62 61 63 6b 67 72  * Current backgr
14db0 6f 75 6e 64 20 63 6f 6c 6f 72 20 2a 2f 0a 20 20  ound color */.  
14dc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77  const char *zNew
14dd0 43 6f 6c 6f 72 3b 20 20 20 20 20 20 20 20 2f 2a  Color;        /*
14de0 20 52 65 76 69 73 65 64 20 62 61 63 6b 67 72 6f   Revised backgro
14df0 75 6e 64 20 63 6f 6c 6f 72 20 2a 2f 0a 20 20 63  und color */.  c
14e00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 54  onst char *zNewT
14e10 61 67 46 6c 61 67 3b 20 20 20 20 20 20 2f 2a 20  agFlag;      /* 
14e20 22 63 68 65 63 6b 65 64 22 20 69 66 20 22 41 64  "checked" if "Ad
14e30 64 20 74 61 67 22 20 69 73 20 63 68 65 63 6b 65  d tag" is checke
14e40 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
14e50 72 20 2a 7a 4e 65 77 54 61 67 3b 20 20 20 20 20  r *zNewTag;     
14e60 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
14e70 74 68 65 20 6e 65 77 20 74 61 67 20 2a 2f 0a 20  the new tag */. 
14e80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65   const char *zNe
14e90 77 42 72 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  wBrFlag;       /
14ea0 2a 20 22 63 68 65 63 6b 65 64 22 20 69 66 20 22  * "checked" if "
14eb0 4e 65 77 20 62 72 61 6e 63 68 22 20 69 73 20 63  New branch" is c
14ec0 68 65 63 6b 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  hecked */.  cons
14ed0 74 20 63 68 61 72 20 2a 7a 4e 65 77 42 72 61 6e  t char *zNewBran
14ee0 63 68 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ch;       /* Nam
14ef0 65 20 6f 66 20 74 68 65 20 6e 65 77 20 62 72 61  e of the new bra
14f00 6e 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nch */.  const c
14f10 68 61 72 20 2a 7a 43 6c 6f 73 65 46 6c 61 67 3b  har *zCloseFlag;
14f20 20 20 20 20 20 20 20 2f 2a 20 22 63 68 65 63 6b         /* "check
14f30 65 64 22 20 69 66 20 22 43 6c 6f 73 65 22 20 69  ed" if "Close" i
14f40 73 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 63  s checked */.  c
14f50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 48 69 64 65  onst char *zHide
14f60 46 6c 61 67 3b 20 20 20 20 20 20 20 20 2f 2a 20  Flag;        /* 
14f70 22 63 68 65 63 6b 65 64 22 20 69 66 20 22 48 69  "checked" if "Hi
14f80 64 65 22 20 69 73 20 63 68 65 63 6b 65 64 20 2a  de" is checked *
14f90 2f 0a 20 20 69 6e 74 20 66 50 72 6f 70 61 67 61  /.  int fPropaga
14fa0 74 65 43 6f 6c 6f 72 3b 20 20 20 20 20 20 20 20  teColor;        
14fb0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6c    /* True if col
14fc0 6f 72 20 70 72 6f 70 61 67 61 74 65 73 20 62 65  or propagates be
14fd0 66 6f 72 65 20 65 64 69 74 20 2a 2f 0a 20 20 69  fore edit */.  i
14fe0 6e 74 20 66 4e 65 77 50 72 6f 70 61 67 61 74 65  nt fNewPropagate
14ff0 43 6f 6c 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Color;       /* 
15000 54 72 75 65 20 69 66 20 63 6f 6c 6f 72 20 70 72  True if color pr
15010 6f 70 61 67 61 74 65 73 20 61 66 74 65 72 20 65  opagates after e
15020 64 69 74 20 2a 2f 0a 20 20 69 6e 74 20 66 48 61  dit */.  int fHa
15030 73 48 69 64 64 65 6e 20 3d 20 30 3b 20 20 20 20  sHidden = 0;    
15040 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
15050 66 20 68 69 64 64 65 6e 20 74 61 67 20 61 6c 72  f hidden tag alr
15060 65 61 64 79 20 73 65 74 20 2a 2f 0a 20 20 69 6e  eady set */.  in
15070 74 20 66 48 61 73 43 6c 6f 73 65 64 20 3d 20 30  t fHasClosed = 0
15080 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
15090 72 75 65 20 69 66 20 63 6c 6f 73 65 64 20 74 61  rue if closed ta
150a0 67 20 61 6c 72 65 61 64 79 20 73 65 74 20 2a 2f  g already set */
150b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
150c0 43 68 6e 67 54 69 6d 65 20 3d 20 30 3b 20 20 20  ChngTime = 0;   
150d0 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 63 68 6e   /* Value of chn
150e0 67 74 69 6d 65 3d 20 71 75 65 72 79 20 70 61 72  gtime= query par
150f0 61 6d 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  am, if any */.  
15100 63 68 61 72 20 2a 7a 55 75 69 64 3b 0a 20 20 42  char *zUuid;.  B
15110 6c 6f 62 20 63 6f 6d 6d 65 6e 74 3b 0a 20 20 63  lob comment;.  c
15120 68 61 72 20 2a 7a 42 72 61 6e 63 68 4e 61 6d 65  har *zBranchName
15130 20 3d 20 30 3b 0a 20 20 53 74 6d 74 20 71 3b 0a   = 0;.  Stmt q;.
15140 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63  .  login_check_c
15150 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20  redentials();.  
15160 69 66 28 20 21 67 2e 70 65 72 6d 2e 57 72 69 74  if( !g.perm.Writ
15170 65 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64 65  e ){ login_neede
15180 64 28 67 2e 61 6e 6f 6e 2e 57 72 69 74 65 29 3b  d(g.anon.Write);
15190 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 72 69 64   return; }.  rid
151a0 20 3d 20 6e 61 6d 65 5f 74 6f 5f 74 79 70 65 64   = name_to_typed
151b0 5f 72 69 64 28 50 28 22 72 22 29 2c 20 22 63 69  _rid(P("r"), "ci
151c0 22 29 3b 0a 20 20 7a 55 75 69 64 20 3d 20 64 62  ");.  zUuid = db
151d0 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54  _text(0, "SELECT
151e0 20 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62 20   uuid FROM blob 
151f0 57 48 45 52 45 20 72 69 64 3d 25 64 22 2c 20 72  WHERE rid=%d", r
15200 69 64 29 3b 0a 20 20 7a 43 6f 6d 6d 65 6e 74 20  id);.  zComment 
15210 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45  = db_text(0, "SE
15220 4c 45 43 54 20 63 6f 61 6c 65 73 63 65 28 65 63  LECT coalesce(ec
15230 6f 6d 6d 65 6e 74 2c 63 6f 6d 6d 65 6e 74 29 22  omment,comment)"
15240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15250 20 20 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d           "  FROM
15260 20 65 76 65 6e 74 20 57 48 45 52 45 20 6f 62 6a   event WHERE obj
15270 69 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20  id=%d", rid);.  
15280 69 66 28 20 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20  if( zComment==0 
15290 29 20 66 6f 73 73 69 6c 5f 72 65 64 69 72 65 63  ) fossil_redirec
152a0 74 5f 68 6f 6d 65 28 29 3b 0a 20 20 69 66 28 20  t_home();.  if( 
152b0 50 28 22 63 61 6e 63 65 6c 22 29 20 29 7b 0a 20  P("cancel") ){. 
152c0 20 20 20 63 67 69 5f 72 65 64 69 72 65 63 74 66     cgi_redirectf
152d0 28 22 25 52 2f 63 69 2f 25 53 22 2c 20 7a 55 75  ("%R/ci/%S", zUu
152e0 69 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  id);.  }.  if( g
152f0 2e 70 65 72 6d 2e 53 65 74 75 70 20 29 20 7a 43  .perm.Setup ) zC
15300 68 6e 67 54 69 6d 65 20 3d 20 50 28 22 63 68 6e  hngTime = P("chn
15310 67 74 69 6d 65 22 29 3b 0a 20 20 7a 4e 65 77 43  gtime");.  zNewC
15320 6f 6d 6d 65 6e 74 20 3d 20 50 44 28 22 63 22 2c  omment = PD("c",
15330 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 7a 55 73  zComment);.  zUs
15340 65 72 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20  er = db_text(0, 
15350 22 53 45 4c 45 43 54 20 63 6f 61 6c 65 73 63 65  "SELECT coalesce
15360 28 65 75 73 65 72 2c 75 73 65 72 29 22 0a 20 20  (euser,user)".  
15370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15380 20 20 20 22 20 20 46 52 4f 4d 20 65 76 65 6e 74     "  FROM event
15390 20 57 48 45 52 45 20 6f 62 6a 69 64 3d 25 64 22   WHERE objid=%d"
153a0 2c 20 72 69 64 29 3b 0a 20 20 69 66 28 20 7a 55  , rid);.  if( zU
153b0 73 65 72 3d 3d 30 20 29 20 66 6f 73 73 69 6c 5f  ser==0 ) fossil_
153c0 72 65 64 69 72 65 63 74 5f 68 6f 6d 65 28 29 3b  redirect_home();
153d0 0a 20 20 7a 4e 65 77 55 73 65 72 20 3d 20 50 44  .  zNewUser = PD
153e0 54 28 22 75 22 2c 7a 55 73 65 72 29 3b 0a 20 20  T("u",zUser);.  
153f0 7a 44 61 74 65 20 3d 20 64 62 5f 74 65 78 74 28  zDate = db_text(
15400 30 2c 20 22 53 45 4c 45 43 54 20 64 61 74 65 74  0, "SELECT datet
15410 69 6d 65 28 6d 74 69 6d 65 29 22 0a 20 20 20 20  ime(mtime)".    
15420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15430 20 22 20 20 46 52 4f 4d 20 65 76 65 6e 74 20 57   "  FROM event W
15440 48 45 52 45 20 6f 62 6a 69 64 3d 25 64 22 2c 20  HERE objid=%d", 
15450 72 69 64 29 3b 0a 20 20 69 66 28 20 7a 44 61 74  rid);.  if( zDat
15460 65 3d 3d 30 20 29 20 66 6f 73 73 69 6c 5f 72 65  e==0 ) fossil_re
15470 64 69 72 65 63 74 5f 68 6f 6d 65 28 29 3b 0a 20  direct_home();. 
15480 20 7a 4e 65 77 44 61 74 65 20 3d 20 50 44 54 28   zNewDate = PDT(
15490 22 64 74 22 2c 7a 44 61 74 65 29 3b 0a 20 20 7a  "dt",zDate);.  z
154a0 43 6f 6c 6f 72 20 3d 20 64 62 5f 74 65 78 74 28  Color = db_text(
154b0 22 22 2c 20 22 53 45 4c 45 43 54 20 62 67 63 6f  "", "SELECT bgco
154c0 6c 6f 72 22 0a 20 20 20 20 20 20 20 20 20 20 20  lor".           
154d0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
154e0 46 52 4f 4d 20 65 76 65 6e 74 20 57 48 45 52 45  FROM event WHERE
154f0 20 6f 62 6a 69 64 3d 25 64 22 2c 20 72 69 64 29   objid=%d", rid)
15500 3b 0a 20 20 7a 4e 65 77 43 6f 6c 6f 72 20 3d 20  ;.  zNewColor = 
15510 50 44 54 28 22 63 6c 72 22 2c 7a 43 6f 6c 6f 72  PDT("clr",zColor
15520 29 3b 0a 20 20 66 50 72 6f 70 61 67 61 74 65 43  );.  fPropagateC
15530 6f 6c 6f 72 20 3d 20 64 62 5f 69 6e 74 28 30 2c  olor = db_int(0,
15540 20 22 53 45 4c 45 43 54 20 74 61 67 74 79 70 65   "SELECT tagtype
15550 20 46 52 4f 4d 20 74 61 67 78 72 65 66 22 0a 20   FROM tagxref". 
15560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
15580 48 45 52 45 20 72 69 64 3d 25 64 20 41 4e 44 20  HERE rid=%d AND 
15590 74 61 67 69 64 3d 25 64 22 2c 0a 20 20 20 20 20  tagid=%d",.     
155a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155b0 20 20 20 20 20 20 20 20 20 72 69 64 2c 20 54 41           rid, TA
155c0 47 5f 42 47 43 4f 4c 4f 52 29 3d 3d 32 3b 0a 20  G_BGCOLOR)==2;. 
155d0 20 66 4e 65 77 50 72 6f 70 61 67 61 74 65 43 6f   fNewPropagateCo
155e0 6c 6f 72 20 3d 20 50 28 22 63 6c 72 22 29 21 3d  lor = P("clr")!=
155f0 30 20 3f 20 50 28 22 70 63 6c 72 22 29 21 3d 30  0 ? P("pclr")!=0
15600 20 3a 20 66 50 72 6f 70 61 67 61 74 65 43 6f 6c   : fPropagateCol
15610 6f 72 3b 0a 20 20 7a 4e 65 77 43 6f 6c 6f 72 46  or;.  zNewColorF
15620 6c 61 67 20 3d 20 50 28 22 6e 65 77 63 6c 72 22  lag = P("newclr"
15630 29 20 3f 20 22 20 63 68 65 63 6b 65 64 22 20 3a  ) ? " checked" :
15640 20 22 22 3b 0a 20 20 7a 4e 65 77 54 61 67 46 6c   "";.  zNewTagFl
15650 61 67 20 3d 20 50 28 22 6e 65 77 74 61 67 22 29  ag = P("newtag")
15660 20 3f 20 22 20 63 68 65 63 6b 65 64 22 20 3a 20   ? " checked" : 
15670 22 22 3b 0a 20 20 7a 4e 65 77 54 61 67 20 3d 20  "";.  zNewTag = 
15680 50 44 54 28 22 74 61 67 6e 61 6d 65 22 2c 22 22  PDT("tagname",""
15690 29 3b 0a 20 20 7a 4e 65 77 42 72 46 6c 61 67 20  );.  zNewBrFlag 
156a0 3d 20 50 28 22 6e 65 77 62 72 22 29 20 3f 20 22  = P("newbr") ? "
156b0 20 63 68 65 63 6b 65 64 22 20 3a 20 22 22 3b 0a   checked" : "";.
156c0 20 20 7a 4e 65 77 42 72 61 6e 63 68 20 3d 20 50    zNewBranch = P
156d0 44 54 28 22 62 72 6e 61 6d 65 22 2c 22 22 29 3b  DT("brname","");
156e0 0a 20 20 7a 43 6c 6f 73 65 46 6c 61 67 20 3d 20  .  zCloseFlag = 
156f0 50 28 22 63 6c 6f 73 65 22 29 20 3f 20 22 20 63  P("close") ? " c
15700 68 65 63 6b 65 64 22 20 3a 20 22 22 3b 0a 20 20  hecked" : "";.  
15710 7a 48 69 64 65 46 6c 61 67 20 3d 20 50 28 22 68  zHideFlag = P("h
15720 69 64 65 22 29 20 3f 20 22 20 63 68 65 63 6b 65  ide") ? " checke
15730 64 22 20 3a 20 22 22 3b 0a 20 20 69 66 28 20 50  d" : "";.  if( P
15740 28 22 61 70 70 6c 79 22 29 20 26 26 20 63 67 69  ("apply") && cgi
15750 5f 63 73 72 66 5f 73 61 66 65 28 31 29 20 29 7b  _csrf_safe(1) ){
15760 0a 20 20 20 20 42 6c 6f 62 20 63 74 72 6c 3b 0a  .    Blob ctrl;.
15770 20 20 20 20 63 68 61 72 20 2a 7a 4e 6f 77 3b 0a      char *zNow;.
15780 0a 20 20 20 20 6c 6f 67 69 6e 5f 76 65 72 69 66  .    login_verif
15790 79 5f 63 73 72 66 5f 73 65 63 72 65 74 28 29 3b  y_csrf_secret();
157a0 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26  .    blob_zero(&
157b0 63 74 72 6c 29 3b 0a 20 20 20 20 7a 4e 6f 77 20  ctrl);.    zNow 
157c0 3d 20 64 61 74 65 5f 69 6e 5f 73 74 61 6e 64 61  = date_in_standa
157d0 72 64 5f 66 6f 72 6d 61 74 28 7a 43 68 6e 67 54  rd_format(zChngT
157e0 69 6d 65 20 3f 20 7a 43 68 6e 67 54 69 6d 65 20  ime ? zChngTime 
157f0 3a 20 22 6e 6f 77 22 29 3b 0a 20 20 20 20 62 6c  : "now");.    bl
15800 6f 62 5f 61 70 70 65 6e 64 66 28 26 63 74 72 6c  ob_appendf(&ctrl
15810 2c 20 22 44 20 25 73 5c 6e 22 2c 20 7a 4e 6f 77  , "D %s\n", zNow
15820 29 3b 0a 20 20 20 20 69 6e 69 74 5f 6e 65 77 74  );.    init_newt
15830 61 67 73 28 29 3b 0a 20 20 20 20 69 66 28 20 7a  ags();.    if( z
15840 4e 65 77 43 6f 6c 6f 72 46 6c 61 67 5b 30 5d 0a  NewColorFlag[0].
15850 20 20 20 20 20 26 26 20 7a 4e 65 77 43 6f 6c 6f       && zNewColo
15860 72 5b 30 5d 0a 20 20 20 20 20 26 26 20 28 66 50  r[0].     && (fP
15870 72 6f 70 61 67 61 74 65 43 6f 6c 6f 72 21 3d 66  ropagateColor!=f
15880 4e 65 77 50 72 6f 70 61 67 61 74 65 43 6f 6c 6f  NewPropagateColo
15890 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  r.             |
158a0 7c 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28  | fossil_strcmp(
158b0 7a 43 6f 6c 6f 72 2c 7a 4e 65 77 43 6f 6c 6f 72  zColor,zNewColor
158c0 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0).    ){.   
158d0 20 20 20 61 64 64 5f 63 6f 6c 6f 72 28 7a 4e 65     add_color(zNe
158e0 77 43 6f 6c 6f 72 2c 66 4e 65 77 50 72 6f 70 61  wColor,fNewPropa
158f0 67 61 74 65 43 6f 6c 6f 72 29 3b 0a 20 20 20 20  gateColor);.    
15900 7d 0a 20 20 20 20 69 66 28 20 63 6f 6d 6d 65 6e  }.    if( commen
15910 74 5f 63 6f 6d 70 61 72 65 28 7a 43 6f 6d 6d 65  t_compare(zComme
15920 6e 74 2c 7a 4e 65 77 43 6f 6d 6d 65 6e 74 29 3d  nt,zNewComment)=
15930 3d 30 20 29 20 61 64 64 5f 63 6f 6d 6d 65 6e 74  =0 ) add_comment
15940 28 7a 4e 65 77 43 6f 6d 6d 65 6e 74 29 3b 0a 20  (zNewComment);. 
15950 20 20 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74     if( fossil_st
15960 72 63 6d 70 28 7a 44 61 74 65 2c 7a 4e 65 77 44  rcmp(zDate,zNewD
15970 61 74 65 29 21 3d 30 20 29 20 61 64 64 5f 64 61  ate)!=0 ) add_da
15980 74 65 28 7a 4e 65 77 44 61 74 65 29 3b 0a 20 20  te(zNewDate);.  
15990 20 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 72    if( fossil_str
159a0 63 6d 70 28 7a 55 73 65 72 2c 7a 4e 65 77 55 73  cmp(zUser,zNewUs
159b0 65 72 29 21 3d 30 20 29 20 61 64 64 5f 75 73 65  er)!=0 ) add_use
159c0 72 28 7a 4e 65 77 55 73 65 72 29 3b 0a 20 20 20  r(zNewUser);.   
159d0 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 0a   db_prepare(&q,.
159e0 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 74         "SELECT t
159f0 61 67 2e 74 61 67 69 64 2c 20 74 61 67 6e 61 6d  ag.tagid, tagnam
15a00 65 20 46 52 4f 4d 20 74 61 67 78 72 65 66 2c 20  e FROM tagxref, 
15a10 74 61 67 22 0a 20 20 20 20 20 20 20 22 20 57 48  tag".       " WH
15a20 45 52 45 20 74 61 67 78 72 65 66 2e 72 69 64 3d  ERE tagxref.rid=
15a30 25 64 20 41 4e 44 20 74 61 67 74 79 70 65 3e 30  %d AND tagtype>0
15a40 20 41 4e 44 20 74 61 67 78 72 65 66 2e 74 61 67   AND tagxref.tag
15a50 69 64 3d 74 61 67 2e 74 61 67 69 64 22 2c 0a 20  id=tag.tagid",. 
15a60 20 20 20 20 20 20 72 69 64 0a 20 20 20 20 29 3b        rid.    );
15a70 0a 20 20 20 20 77 68 69 6c 65 28 20 64 62 5f 73  .    while( db_s
15a80 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f  tep(&q)==SQLITE_
15a90 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ROW ){.      int
15aa0 20 74 61 67 69 64 20 3d 20 64 62 5f 63 6f 6c 75   tagid = db_colu
15ab0 6d 6e 5f 69 6e 74 28 26 71 2c 20 30 29 3b 0a 20  mn_int(&q, 0);. 
15ac0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
15ad0 2a 7a 54 61 67 20 3d 20 64 62 5f 63 6f 6c 75 6d  *zTag = db_colum
15ae0 6e 5f 74 65 78 74 28 26 71 2c 20 31 29 3b 0a 20  n_text(&q, 1);. 
15af0 20 20 20 20 20 63 68 61 72 20 7a 4c 61 62 65 6c       char zLabel
15b00 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  [30];.      sqli
15b10 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
15b20 65 6f 66 28 7a 4c 61 62 65 6c 29 2c 20 7a 4c 61  eof(zLabel), zLa
15b30 62 65 6c 2c 20 22 63 25 64 22 2c 20 74 61 67 69  bel, "c%d", tagi
15b40 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 50 28  d);.      if( P(
15b50 7a 4c 61 62 65 6c 29 20 29 20 63 61 6e 63 65 6c  zLabel) ) cancel
15b60 5f 73 70 65 63 69 61 6c 28 7a 54 61 67 29 3b 0a  _special(zTag);.
15b70 20 20 20 20 7d 0a 20 20 20 20 64 62 5f 66 69 6e      }.    db_fin
15b80 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 20 20 69  alize(&q);.    i
15b90 66 28 20 7a 48 69 64 65 46 6c 61 67 5b 30 5d 20  f( zHideFlag[0] 
15ba0 29 20 68 69 64 65 5f 62 72 61 6e 63 68 28 29 3b  ) hide_branch();
15bb0 0a 20 20 20 20 69 66 28 20 7a 43 6c 6f 73 65 46  .    if( zCloseF
15bc0 6c 61 67 5b 30 5d 20 29 20 63 6c 6f 73 65 5f 6c  lag[0] ) close_l
15bd0 65 61 66 28 72 69 64 29 3b 0a 20 20 20 20 69 66  eaf(rid);.    if
15be0 28 20 7a 4e 65 77 54 61 67 46 6c 61 67 5b 30 5d  ( zNewTagFlag[0]
15bf0 20 26 26 20 7a 4e 65 77 54 61 67 5b 30 5d 20 29   && zNewTag[0] )
15c00 20 61 64 64 5f 74 61 67 28 7a 4e 65 77 54 61 67   add_tag(zNewTag
15c10 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 65 77 42  );.    if( zNewB
15c20 72 46 6c 61 67 5b 30 5d 20 26 26 20 7a 4e 65 77  rFlag[0] && zNew
15c30 42 72 61 6e 63 68 5b 30 5d 20 29 20 63 68 61 6e  Branch[0] ) chan
15c40 67 65 5f 62 72 61 6e 63 68 28 72 69 64 2c 7a 4e  ge_branch(rid,zN
15c50 65 77 42 72 61 6e 63 68 29 3b 0a 20 20 20 20 61  ewBranch);.    a
15c60 70 70 6c 79 5f 6e 65 77 74 61 67 73 28 26 63 74  pply_newtags(&ct
15c70 72 6c 2c 20 72 69 64 2c 20 7a 55 75 69 64 2c 20  rl, rid, zUuid, 
15c80 30 2c 20 30 29 3b 0a 20 20 20 20 63 67 69 5f 72  0, 0);.    cgi_r
15c90 65 64 69 72 65 63 74 66 28 22 25 52 2f 63 69 2f  edirectf("%R/ci/
15ca0 25 53 22 2c 20 7a 55 75 69 64 29 3b 0a 20 20 7d  %S", zUuid);.  }
15cb0 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 63 6f  .  blob_zero(&co
15cc0 6d 6d 65 6e 74 29 3b 0a 20 20 62 6c 6f 62 5f 61  mment);.  blob_a
15cd0 70 70 65 6e 64 28 26 63 6f 6d 6d 65 6e 74 2c 20  ppend(&comment, 
15ce0 7a 4e 65 77 43 6f 6d 6d 65 6e 74 2c 20 2d 31 29  zNewComment, -1)
15cf0 3b 0a 20 20 7a 55 75 69 64 5b 31 30 5d 20 3d 20  ;.  zUuid[10] = 
15d00 30 3b 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65  0;.  style_heade
15d10 72 28 22 45 64 69 74 20 43 68 65 63 6b 2d 69 6e  r("Edit Check-in
15d20 20 5b 25 73 5d 22 2c 20 7a 55 75 69 64 29 3b 0a   [%s]", zUuid);.
15d30 20 20 69 66 28 20 50 28 22 70 72 65 76 69 65 77    if( P("preview
15d40 22 29 20 29 7b 0a 20 20 20 20 42 6c 6f 62 20 73  ") ){.    Blob s
15d50 75 66 66 69 78 3b 0a 20 20 20 20 69 6e 74 20 6e  uffix;.    int n
15d60 54 61 67 20 3d 20 30 3b 0a 20 20 20 20 40 20 3c  Tag = 0;.    @ <
15d70 62 3e 50 72 65 76 69 65 77 3a 3c 2f 62 3e 0a 20  b>Preview:</b>. 
15d80 20 20 20 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65     @ <blockquote
15d90 3e 0a 20 20 20 20 40 20 3c 74 61 62 6c 65 20 62  >.    @ <table b
15da0 6f 72 64 65 72 3d 30 3e 0a 20 20 20 20 69 66 28  order=0>.    if(
15db0 20 7a 4e 65 77 43 6f 6c 6f 72 46 6c 61 67 5b 30   zNewColorFlag[0
15dc0 5d 20 26 26 20 7a 4e 65 77 43 6f 6c 6f 72 20 26  ] && zNewColor &
15dd0 26 20 7a 4e 65 77 43 6f 6c 6f 72 5b 30 5d 20 29  & zNewColor[0] )
15de0 7b 0a 20 20 20 20 20 20 40 20 3c 74 72 3e 3c 74  {.      @ <tr><t
15df0 64 20 73 74 79 6c 65 3d 22 62 61 63 6b 67 72 6f  d style="backgro
15e00 75 6e 64 2d 63 6f 6c 6f 72 3a 20 25 68 28 7a 4e  und-color: %h(zN
15e10 65 77 43 6f 6c 6f 72 29 3b 22 3e 0a 20 20 20 20  ewColor);">.    
15e20 7d 65 6c 73 65 20 69 66 28 20 7a 43 6f 6c 6f 72  }else if( zColor
15e30 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 40 20 3c  [0] ){.      @ <
15e40 74 72 3e 3c 74 64 20 73 74 79 6c 65 3d 22 62 61  tr><td style="ba
15e50 63 6b 67 72 6f 75 6e 64 2d 63 6f 6c 6f 72 3a 20  ckground-color: 
15e60 25 68 28 7a 43 6f 6c 6f 72 29 3b 22 3e 0a 20 20  %h(zColor);">.  
15e70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 40    }else{.      @
15e80 20 3c 74 72 3e 3c 74 64 3e 0a 20 20 20 20 7d 0a   <tr><td>.    }.
15e90 20 20 20 20 40 20 25 21 57 28 62 6c 6f 62 5f 73      @ %!W(blob_s
15ea0 74 72 28 26 63 6f 6d 6d 65 6e 74 29 29 0a 20 20  tr(&comment)).  
15eb0 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 73 75 66    blob_zero(&suf
15ec0 66 69 78 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61  fix);.    blob_a
15ed0 70 70 65 6e 64 66 28 26 73 75 66 66 69 78 2c 20  ppendf(&suffix, 
15ee0 22 28 75 73 65 72 3a 20 25 68 22 2c 20 7a 4e 65  "(user: %h", zNe
15ef0 77 55 73 65 72 29 3b 0a 20 20 20 20 64 62 5f 70  wUser);.    db_p
15f00 72 65 70 61 72 65 28 26 71 2c 20 22 53 45 4c 45  repare(&q, "SELE
15f10 43 54 20 73 75 62 73 74 72 28 74 61 67 6e 61 6d  CT substr(tagnam
15f20 65 2c 35 29 20 46 52 4f 4d 20 74 61 67 78 72 65  e,5) FROM tagxre
15f30 66 2c 20 74 61 67 22 0a 20 20 20 20 20 20 20 20  f, tag".        
15f40 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45             " WHE
15f50 52 45 20 74 61 67 6e 61 6d 65 20 47 4c 4f 42 20  RE tagname GLOB 
15f60 27 73 79 6d 2d 2a 27 20 41 4e 44 20 74 61 67 78  'sym-*' AND tagx
15f70 72 65 66 2e 72 69 64 3d 25 64 22 0a 20 20 20 20  ref.rid=%d".    
15f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
15f90 20 20 20 41 4e 44 20 74 61 67 74 79 70 65 3e 31     AND tagtype>1
15fa0 20 41 4e 44 20 74 61 67 2e 74 61 67 69 64 3d 74   AND tag.tagid=t
15fb0 61 67 78 72 65 66 2e 74 61 67 69 64 22 2c 0a 20  agxref.tagid",. 
15fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fd0 20 20 72 69 64 29 3b 0a 20 20 20 20 77 68 69 6c    rid);.    whil
15fe0 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d  e( db_step(&q)==
15ff0 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
16000 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
16010 7a 54 61 67 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  zTag = db_column
16020 5f 74 65 78 74 28 26 71 2c 20 30 29 3b 0a 20 20  _text(&q, 0);.  
16030 20 20 20 20 69 66 28 20 6e 54 61 67 3d 3d 30 20      if( nTag==0 
16040 29 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f  ){.        blob_
16050 61 70 70 65 6e 64 66 28 26 73 75 66 66 69 78 2c  appendf(&suffix,
16060 20 22 2c 20 74 61 67 73 3a 20 25 68 22 2c 20 7a   ", tags: %h", z
16070 54 61 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Tag);.      }els
16080 65 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f  e{.        blob_
16090 61 70 70 65 6e 64 66 28 26 73 75 66 66 69 78 2c  appendf(&suffix,
160a0 20 22 2c 20 25 68 22 2c 20 7a 54 61 67 29 3b 0a   ", %h", zTag);.
160b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 54        }.      nT
160c0 61 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ag++;.    }.    
160d0 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b  db_finalize(&q);
160e0 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64  .    blob_append
160f0 66 28 26 73 75 66 66 69 78 2c 20 22 29 22 29 3b  f(&suffix, ")");
16100 0a 20 20 20 20 40 20 25 73 28 62 6c 6f 62 5f 73  .    @ %s(blob_s
16110 74 72 28 26 73 75 66 66 69 78 29 29 0a 20 20 20  tr(&suffix)).   
16120 20 40 20 3c 2f 74 64 3e 3c 2f 74 72 3e 3c 2f 74   @ </td></tr></t
16130 61 62 6c 65 3e 0a 20 20 20 20 69 66 28 20 7a 43  able>.    if( zC
16140 68 6e 67 54 69 6d 65 20 29 7b 0a 20 20 20 20 20  hngTime ){.     
16150 20 40 20 3c 70 3e 54 68 65 20 74 69 6d 65 73 74   @ <p>The timest
16160 61 6d 70 20 6f 6e 20 74 68 65 20 74 61 67 20 75  amp on the tag u
16170 73 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  sed to make the 
16180 63 68 61 6e 67 65 73 20 61 62 6f 76 65 0a 20 20  changes above.  
16190 20 20 20 20 40 20 77 69 6c 6c 20 62 65 20 6f 76      @ will be ov
161a0 65 72 72 69 64 64 65 6e 20 61 73 3a 20 25 73 28  erridden as: %s(
161b0 64 61 74 65 5f 69 6e 5f 73 74 61 6e 64 61 72 64  date_in_standard
161c0 5f 66 6f 72 6d 61 74 28 7a 43 68 6e 67 54 69 6d  _format(zChngTim
161d0 65 29 29 3c 2f 70 3e 0a 20 20 20 20 7d 0a 20 20  e))</p>.    }.  
161e0 20 20 40 20 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65    @ </blockquote
161f0 3e 0a 20 20 20 20 40 20 3c 68 72 20 2f 3e 0a 20  >.    @ <hr />. 
16200 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 73     blob_reset(&s
16210 75 66 66 69 78 29 3b 0a 20 20 7d 0a 20 20 40 20  uffix);.  }.  @ 
16220 3c 70 3e 4d 61 6b 65 20 63 68 61 6e 67 65 73 20  <p>Make changes 
16230 74 6f 20 61 74 74 72 69 62 75 74 65 73 20 6f 66  to attributes of
16240 20 63 68 65 63 6b 2d 69 6e 0a 20 20 40 20 5b 25   check-in.  @ [%
16250 7a 28 68 72 65 66 28 22 25 52 2f 63 69 2f 25 21  z(href("%R/ci/%!
16260 53 22 2c 7a 55 75 69 64 29 29 25 73 28 7a 55 75  S",zUuid))%s(zUu
16270 69 64 29 3c 2f 61 3e 5d 3a 3c 2f 70 3e 0a 20 20  id)</a>]:</p>.  
16280 66 6f 72 6d 5f 62 65 67 69 6e 28 30 2c 20 22 25  form_begin(0, "%
16290 52 2f 63 69 5f 65 64 69 74 22 29 3b 0a 20 20 6c  R/ci_edit");.  l
162a0 6f 67 69 6e 5f 69 6e 73 65 72 74 5f 63 73 72 66  ogin_insert_csrf
162b0 5f 73 65 63 72 65 74 28 29 3b 0a 20 20 40 20 3c  _secret();.  @ <
162c0 64 69 76 3e 3c 69 6e 70 75 74 20 74 79 70 65 3d  div><input type=
162d0 22 68 69 64 64 65 6e 22 20 6e 61 6d 65 3d 22 72  "hidden" name="r
162e0 22 20 76 61 6c 75 65 3d 22 25 73 28 7a 55 75 69  " value="%s(zUui
162f0 64 29 22 20 2f 3e 0a 20 20 40 20 3c 74 61 62 6c  d)" />.  @ <tabl
16300 65 20 62 6f 72 64 65 72 3d 22 30 22 20 63 65 6c  e border="0" cel
16310 6c 73 70 61 63 69 6e 67 3d 22 31 30 22 3e 0a 0a  lspacing="10">..
16320 20 20 40 20 3c 74 72 3e 3c 74 68 20 61 6c 69 67    @ <tr><th alig
16330 6e 3d 22 72 69 67 68 74 22 20 76 61 6c 69 67 6e  n="right" valign
16340 3d 22 74 6f 70 22 3e 55 73 65 72 3a 3c 2f 74 68  ="top">User:</th
16350 3e 0a 20 20 40 20 3c 74 64 20 76 61 6c 69 67 6e  >.  @ <td valign
16360 3d 22 74 6f 70 22 3e 0a 20 20 40 20 20 20 3c 69  ="top">.  @   <i
16370 6e 70 75 74 20 74 79 70 65 3d 22 74 65 78 74 22  nput type="text"
16380 20 6e 61 6d 65 3d 22 75 22 20 73 69 7a 65 3d 22   name="u" size="
16390 32 30 22 20 76 61 6c 75 65 3d 22 25 68 28 7a 4e  20" value="%h(zN
163a0 65 77 55 73 65 72 29 22 20 2f 3e 0a 20 20 40 20  ewUser)" />.  @ 
163b0 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 0a 20 20 40 20  </td></tr>..  @ 
163c0 3c 74 72 3e 3c 74 68 20 61 6c 69 67 6e 3d 22 72  <tr><th align="r
163d0 69 67 68 74 22 20 76 61 6c 69 67 6e 3d 22 74 6f  ight" valign="to
163e0 70 22 3e 43 6f 6d 6d 65 6e 74 3a 3c 2f 74 68 3e  p">Comment:</th>
163f0 0a 20 20 40 20 3c 74 64 20 76 61 6c 69 67 6e 3d  .  @ <td valign=
16400 22 74 6f 70 22 3e 0a 20 20 40 20 3c 74 65 78 74  "top">.  @ <text
16410 61 72 65 61 20 6e 61 6d 65 3d 22 63 22 20 72 6f  area name="c" ro
16420 77 73 3d 22 31 30 22 20 63 6f 6c 73 3d 22 38 30  ws="10" cols="80
16430 22 3e 25 68 28 7a 4e 65 77 43 6f 6d 6d 65 6e 74  ">%h(zNewComment
16440 29 3c 2f 74 65 78 74 61 72 65 61 3e 0a 20 20 40  )</textarea>.  @
16450 20 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 0a 20 20 40   </td></tr>..  @
16460 20 3c 74 72 3e 3c 74 68 20 61 6c 69 67 6e 3d 22   <tr><th align="
16470 72 69 67 68 74 22 20 76 61 6c 69 67 6e 3d 22 74  right" valign="t
16480 6f 70 22 3e 43 68 65 63 6b 2d 69 6e 20 54 69 6d  op">Check-in Tim
16490 65 3a 3c 2f 74 68 3e 0a 20 20 40 20 3c 74 64 20  e:</th>.  @ <td 
164a0 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 0a 20 20  valign="top">.  
164b0 40 20 20 20 3c 69 6e 70 75 74 20 74 79 70 65 3d  @   <input type=
164c0 22 74 65 78 74 22 20 6e 61 6d 65 3d 22 64 74 22  "text" name="dt"
164d0 20 73 69 7a 65 3d 22 32 30 22 20 76 61 6c 75 65   size="20" value
164e0 3d 22 25 68 28 7a 4e 65 77 44 61 74 65 29 22 20  ="%h(zNewDate)" 
164f0 2f 3e 0a 20 20 40 20 3c 2f 74 64 3e 3c 2f 74 72  />.  @ </td></tr
16500 3e 0a 0a 20 20 69 66 28 20 7a 43 68 6e 67 54 69  >..  if( zChngTi
16510 6d 65 20 29 7b 0a 20 20 20 20 40 20 3c 74 72 3e  me ){.    @ <tr>
16520 3c 74 68 20 61 6c 69 67 6e 3d 22 72 69 67 68 74  <th align="right
16530 22 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 54  " valign="top">T
16540 69 6d 65 73 74 61 6d 70 20 6f 66 20 74 68 69 73  imestamp of this
16550 20 63 68 61 6e 67 65 3a 3c 2f 74 68 3e 0a 20 20   change:</th>.  
16560 20 20 40 20 3c 74 64 20 76 61 6c 69 67 6e 3d 22    @ <td valign="
16570 74 6f 70 22 3e 0a 20 20 20 20 40 20 20 20 3c 69  top">.    @   <i
16580 6e 70 75 74 20 74 79 70 65 3d 22 74 65 78 74 22  nput type="text"
16590 20 6e 61 6d 65 3d 22 63 68 6e 67 74 69 6d 65 22   name="chngtime"
165a0 20 73 69 7a 65 3d 22 32 30 22 20 76 61 6c 75 65   size="20" value
165b0 3d 22 25 68 28 7a 43 68 6e 67 54 69 6d 65 29 22  ="%h(zChngTime)"
165c0 20 2f 3e 0a 20 20 20 20 40 20 3c 2f 74 64 3e 3c   />.    @ </td><
165d0 2f 74 72 3e 0a 20 20 7d 0a 0a 20 20 40 20 3c 74  /tr>.  }..  @ <t
165e0 72 3e 3c 74 68 20 61 6c 69 67 6e 3d 22 72 69 67  r><th align="rig
165f0 68 74 22 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22  ht" valign="top"
16600 3e 42 61 63 6b 67 72 6f 75 6e 64 26 6e 62 73 70  >Background&nbsp
16610 3b 43 6f 6c 6f 72 3a 3c 2f 74 68 3e 0a 20 20 40  ;Color:</th>.  @
16620 20 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74 6f 70   <td valign="top
16630 22 3e 0a 20 20 40 20 3c 64 69 76 3e 3c 6c 61 62  ">.  @ <div><lab
16640 65 6c 3e 3c 69 6e 70 75 74 20 74 79 70 65 3d 27  el><input type='
16650 63 68 65 63 6b 62 6f 78 27 20 6e 61 6d 65 3d 27  checkbox' name='
16660 6e 65 77 63 6c 72 27 25 73 28 7a 4e 65 77 43 6f  newclr'%s(zNewCo
16670 6c 6f 72 46 6c 61 67 29 20 2f 3e 0a 20 20 40 20  lorFlag) />.  @ 
16680 43 68 61 6e 67 65 20 62 61 63 6b 67 72 6f 75 6e  Change backgroun
16690 64 20 63 6f 6c 6f 72 3a 20 5c 0a 20 20 40 20 3c  d color: \.  @ <
166a0 69 6e 70 75 74 20 74 79 70 65 3d 27 63 6f 6c 6f  input type='colo
166b0 72 27 20 6e 61 6d 65 3d 27 63 6c 72 27 5c 0a 20  r' name='clr'\. 
166c0 20 40 20 76 61 6c 75 65 3d 27 25 73 28 7a 4e 65   @ value='%s(zNe
166d0 77 43 6f 6c 6f 72 5b 30 5d 3f 7a 4e 65 77 43 6f  wColor[0]?zNewCo
166e0 6c 6f 72 3a 22 23 38 30 38 30 38 30 22 29 27 3e  lor:"#808080")'>
166f0 3c 2f 6c 61 62 65 6c 3e 3c 2f 64 69 76 3e 0a 20  </label></div>. 
16700 20 40 20 3c 64 69 76 3e 3c 6c 61 62 65 6c 3e 0a   @ <div><label>.
16710 20 20 69 66 28 20 66 4e 65 77 50 72 6f 70 61 67    if( fNewPropag
16720 61 74 65 43 6f 6c 6f 72 20 29 7b 0a 20 20 20 20  ateColor ){.    
16730 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 63  @ <input type="c
16740 68 65 63 6b 62 6f 78 22 20 6e 61 6d 65 3d 22 70  heckbox" name="p
16750 63 6c 72 22 20 63 68 65 63 6b 65 64 3d 22 63 68  clr" checked="ch
16760 65 63 6b 65 64 22 20 2f 3e 0a 20 20 7d 65 6c 73  ecked" />.  }els
16770 65 7b 0a 20 20 20 20 40 20 3c 69 6e 70 75 74 20  e{.    @ <input 
16780 74 79 70 65 3d 22 63 68 65 63 6b 62 6f 78 22 20  type="checkbox" 
16790 6e 61 6d 65 3d 22 70 63 6c 72 22 20 2f 3e 0a 20  name="pclr" />. 
167a0 20 7d 0a 20 20 40 20 50 72 6f 70 61 67 61 74 65   }.  @ Propagate
167b0 20 63 6f 6c 6f 72 20 74 6f 20 64 65 73 63 65 6e   color to descen
167c0 64 61 6e 74 73 3c 2f 6c 61 62 65 6c 3e 3c 2f 64  dants</label></d
167d0 69 76 3e 0a 20 20 40 20 3c 2f 74 64 3e 3c 2f 74  iv>.  @ </td></t
167e0 72 3e 0a 0a 20 20 40 20 3c 74 72 3e 3c 74 68 20  r>..  @ <tr><th 
167f0 61 6c 69 67 6e 3d 22 72 69 67 68 74 22 20 76 61  align="right" va
16800 6c 69 67 6e 3d 22 74 6f 70 22 3e 54 61 67 73 3a  lign="top">Tags:
16810 3c 2f 74 68 3e 0a 20 20 40 20 3c 74 64 20 76 61  </th>.  @ <td va
16820 6c 69 67 6e 3d 22 74 6f 70 22 3e 0a 20 20 40 20  lign="top">.  @ 
16830 3c 6c 61 62 65 6c 3e 3c 69 6e 70 75 74 20 74 79  <label><input ty
16840 70 65 3d 22 63 68 65 63 6b 62 6f 78 22 20 69 64  pe="checkbox" id
16850 3d 22 6e 65 77 74 61 67 22 20 6e 61 6d 65 3d 22  ="newtag" name="
16860 6e 65 77 74 61 67 22 25 73 28 7a 4e 65 77 54 61  newtag"%s(zNewTa
16870 67 46 6c 61 67 29 20 2f 3e 0a 20 20 40 20 41 64  gFlag) />.  @ Ad
16880 64 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  d the following 
16890 6e 65 77 20 74 61 67 20 6e 61 6d 65 20 74 6f 20  new tag name to 
168a0 74 68 69 73 20 63 68 65 63 6b 2d 69 6e 3a 3c 2f  this check-in:</
168b0 6c 61 62 65 6c 3e 0a 20 20 40 20 3c 69 6e 70 75  label>.  @ <inpu
168c0 74 20 74 79 70 65 3d 22 74 65 78 74 22 20 73 69  t type="text" si
168d0 7a 65 3d 27 31 35 27 20 6e 61 6d 65 3d 22 74 61  ze='15' name="ta
168e0 67 6e 61 6d 65 22 20 76 61 6c 75 65 3d 22 25 68  gname" value="%h
168f0 28 7a 4e 65 77 54 61 67 29 22 20 5c 0a 20 20 40  (zNewTag)" \.  @
16900 20 69 64 3d 27 74 61 67 6e 61 6d 65 27 20 2f 3e   id='tagname' />
16910 0a 20 20 7a 42 72 61 6e 63 68 4e 61 6d 65 20 3d  .  zBranchName =
16920 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c   db_text(0, "SEL
16930 45 43 54 20 76 61 6c 75 65 20 46 52 4f 4d 20 74  ECT value FROM t
16940 61 67 78 72 65 66 2c 20 74 61 67 22 0a 20 20 20  agxref, tag".   
16950 20 20 22 20 57 48 45 52 45 20 74 61 67 78 72 65    " WHERE tagxre
16960 66 2e 72 69 64 3d 25 64 20 41 4e 44 20 74 61 67  f.rid=%d AND tag
16970 74 79 70 65 3e 30 20 41 4e 44 20 74 61 67 78 72  type>0 AND tagxr
16980 65 66 2e 74 61 67 69 64 3d 74 61 67 2e 74 61 67  ef.tagid=tag.tag
16990 69 64 22 0a 20 20 20 20 20 22 20 41 4e 44 20 74  id".     " AND t
169a0 61 67 78 72 65 66 2e 74 61 67 69 64 3d 25 64 22  agxref.tagid=%d"
169b0 2c 20 72 69 64 2c 20 54 41 47 5f 42 52 41 4e 43  , rid, TAG_BRANC
169c0 48 29 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65  H);.  db_prepare
169d0 28 26 71 2c 0a 20 20 20 20 20 22 53 45 4c 45 43  (&q,.     "SELEC
169e0 54 20 74 61 67 2e 74 61 67 69 64 2c 20 74 61 67  T tag.tagid, tag
169f0 6e 61 6d 65 2c 20 74 61 67 78 72 65 66 2e 76 61  name, tagxref.va
16a00 6c 75 65 20 46 52 4f 4d 20 74 61 67 78 72 65 66  lue FROM tagxref
16a10 2c 20 74 61 67 22 0a 20 20 20 20 20 22 20 57 48  , tag".     " WH
16a20 45 52 45 20 74 61 67 78 72 65 66 2e 72 69 64 3d  ERE tagxref.rid=
16a30 25 64 20 41 4e 44 20 74 61 67 74 79 70 65 3e 30  %d AND tagtype>0
16a40 20 41 4e 44 20 74 61 67 78 72 65 66 2e 74 61 67   AND tagxref.tag
16a50 69 64 3d 74 61 67 2e 74 61 67 69 64 22 0a 20 20  id=tag.tagid".  
16a60 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 43 41     " ORDER BY CA
16a70 53 45 20 57 48 45 4e 20 74 61 67 6e 61 6d 65 20  SE WHEN tagname 
16a80 47 4c 4f 42 20 27 73 79 6d 2d 2a 27 20 54 48 45  GLOB 'sym-*' THE
16a90 4e 20 73 75 62 73 74 72 28 74 61 67 6e 61 6d 65  N substr(tagname
16aa0 2c 35 29 22 0a 20 20 20 20 20 22 20 20 20 20 20  ,5)".     "     
16ab0 20 20 20 20 20 20 20 20 20 20 45 4c 53 45 20 74            ELSE t
16ac0 61 67 6e 61 6d 65 20 45 4e 44 20 2f 2a 73 6f 72  agname END /*sor
16ad0 74 2a 2f 22 2c 0a 20 20 20 20 20 72 69 64 0a 20  t*/",.     rid. 
16ae0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 64 62 5f   );.  while( db_
16af0 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45  step(&q)==SQLITE
16b00 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74 20  _ROW ){.    int 
16b10 74 61 67 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d  tagid = db_colum
16b20 6e 5f 69 6e 74 28 26 71 2c 20 30 29 3b 0a 20 20  n_int(&q, 0);.  
16b30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
16b40 61 67 4e 61 6d 65 20 3d 20 64 62 5f 63 6f 6c 75  agName = db_colu
16b50 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31 29 3b 0a  mn_text(&q, 1);.
16b60 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69 61      int isSpecia
16b70 6c 54 61 67 20 3d 20 66 6f 73 73 69 6c 5f 73 74  lTag = fossil_st
16b80 72 6e 63 6d 70 28 7a 54 61 67 4e 61 6d 65 2c 20  rncmp(zTagName, 
16b90 22 73 79 6d 2d 22 2c 20 34 29 21 3d 30 3b 0a 20  "sym-", 4)!=0;. 
16ba0 20 20 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 33     char zLabel[3
16bb0 30 5d 3b 0a 0a 20 20 20 20 69 66 28 20 74 61 67  0];..    if( tag
16bc0 69 64 20 3d 3d 20 54 41 47 5f 43 4c 4f 53 45 44  id == TAG_CLOSED
16bd0 20 29 7b 0a 20 20 20 20 20 20 66 48 61 73 43 6c   ){.      fHasCl
16be0 6f 73 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65  osed = 1;.    }e
16bf0 6c 73 65 20 69 66 28 20 28 74 61 67 69 64 20 3d  lse if( (tagid =
16c00 3d 20 54 41 47 5f 43 4f 4d 4d 45 4e 54 29 20 7c  = TAG_COMMENT) |
16c10 7c 20 28 74 61 67 69 64 20 3d 3d 20 54 41 47 5f  | (tagid == TAG_
16c20 42 52 41 4e 43 48 29 20 29 7b 0a 20 20 20 20 20  BRANCH) ){.     
16c30 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
16c40 65 6c 73 65 20 69 66 28 20 74 61 67 69 64 3d 3d  else if( tagid==
16c50 54 41 47 5f 48 49 44 44 45 4e 20 29 7b 0a 20 20  TAG_HIDDEN ){.  
16c60 20 20 20 20 66 48 61 73 48 69 64 64 65 6e 20 3d      fHasHidden =
16c70 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
16c80 28 20 21 69 73 53 70 65 63 69 61 6c 54 61 67 20  ( !isSpecialTag 
16c90 26 26 20 7a 54 61 67 4e 61 6d 65 20 26 26 0a 20  && zTagName &&. 
16ca0 20 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 73 74         fossil_st
16cb0 72 63 6d 70 28 26 7a 54 61 67 4e 61 6d 65 5b 34  rcmp(&zTagName[4
16cc0 5d 2c 20 7a 42 72 61 6e 63 68 4e 61 6d 65 29 3d  ], zBranchName)=
16cd0 3d 30 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69  =0){.      conti
16ce0 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  nue;.    }.    s
16cf0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
16d00 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 2c 20  sizeof(zLabel), 
16d10 7a 4c 61 62 65 6c 2c 20 22 63 25 64 22 2c 20 74  zLabel, "c%d", t
16d20 61 67 69 64 29 3b 0a 20 20 20 20 40 20 3c 62 72  agid);.    @ <br
16d30 20 2f 3e 3c 6c 61 62 65 6c 3e 0a 20 20 20 20 69   /><label>.    i
16d40 66 28 20 50 28 7a 4c 61 62 65 6c 29 20 29 7b 0a  f( P(zLabel) ){.
16d50 20 20 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74        @ <input t
16d60 79 70 65 3d 22 63 68 65 63 6b 62 6f 78 22 20 6e  ype="checkbox" n
16d70 61 6d 65 3d 22 63 25 64 28 74 61 67 69 64 29 22  ame="c%d(tagid)"
16d80 20 63 68 65 63 6b 65 64 3d 22 63 68 65 63 6b 65   checked="checke
16d90 64 22 20 2f 3e 0a 20 20 20 20 7d 65 6c 73 65 7b  d" />.    }else{
16da0 0a 20 20 20 20 20 20 40 20 3c 69 6e 70 75 74 20  .      @ <input 
16db0 74 79 70 65 3d 22 63 68 65 63 6b 62 6f 78 22 20  type="checkbox" 
16dc0 6e 61 6d 65 3d 22 63 25 64 28 74 61 67 69 64 29  name="c%d(tagid)
16dd0 22 20 2f 3e 0a 20 20 20 20 7d 0a 20 20 20 20 69  " />.    }.    i
16de0 66 28 20 69 73 53 70 65 63 69 61 6c 54 61 67 20  f( isSpecialTag 
16df0 29 7b 0a 20 20 20 20 20 20 40 20 43 61 6e 63 65  ){.      @ Cance
16e00 6c 20 73 70 65 63 69 61 6c 20 74 61 67 20 3c 62  l special tag <b
16e10 3e 25 68 28 7a 54 61 67 4e 61 6d 65 29 3c 2f 62  >%h(zTagName)</b
16e20 3e 3c 2f 6c 61 62 65 6c 3e 0a 20 20 20 20 7d 65  ></label>.    }e
16e30 6c 73 65 7b 0a 20 20 20 20 20 20 40 20 43 61 6e  lse{.      @ Can
16e40 63 65 6c 20 74 61 67 20 3c 62 3e 25 68 28 26 7a  cel tag <b>%h(&z
16e50 54 61 67 4e 61 6d 65 5b 34 5d 29 3c 2f 62 3e 3c  TagName[4])</b><
16e60 2f 6c 61 62 65 6c 3e 0a 20 20 20 20 7d 0a 20 20  /label>.    }.  
16e70 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28  }.  db_finalize(
16e80 26 71 29 3b 0a 20 20 40 20 3c 2f 74 64 3e 3c 2f  &q);.  @ </td></
16e90 74 72 3e 0a 0a 20 20 69 66 28 20 21 7a 42 72 61  tr>..  if( !zBra
16ea0 6e 63 68 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  nchName ){.    z
16eb0 42 72 61 6e 63 68 4e 61 6d 65 20 3d 20 64 62 5f  BranchName = db_
16ec0 67 65 74 28 22 6d 61 69 6e 2d 62 72 61 6e 63 68  get("main-branch
16ed0 22 2c 20 22 74 72 75 6e 6b 22 29 3b 0a 20 20 7d  ", "trunk");.  }
16ee0 0a 20 20 69 66 28 20 21 7a 4e 65 77 42 72 61 6e  .  if( !zNewBran
16ef0 63 68 20 7c 7c 20 21 7a 4e 65 77 42 72 61 6e 63  ch || !zNewBranc
16f00 68 5b 30 5d 29 7b 0a 20 20 20 20 7a 4e 65 77 42  h[0]){.    zNewB
16f10 72 61 6e 63 68 20 3d 20 7a 42 72 61 6e 63 68 4e  ranch = zBranchN
16f20 61 6d 65 3b 0a 20 20 7d 0a 20 20 40 20 3c 74 72  ame;.  }.  @ <tr
16f30 3e 3c 74 68 20 61 6c 69 67 6e 3d 22 72 69 67 68  ><th align="righ
16f40 74 22 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e  t" valign="top">
16f50 42 72 61 6e 63 68 69 6e 67 3a 3c 2f 74 68 3e 0a  Branching:</th>.
16f60 20 20 40 20 3c 74 64 20 76 61 6c 69 67 6e 3d 22    @ <td valign="
16f70 74 6f 70 22 3e 0a 20 20 40 20 3c 6c 61 62 65 6c  top">.  @ <label
16f80 3e 3c 69 6e 70 75 74 20 69 64 3d 22 6e 65 77 62  ><input id="newb
16f90 72 22 20 74 79 70 65 3d 22 63 68 65 63 6b 62 6f  r" type="checkbo
16fa0 78 22 20 6e 61 6d 65 3d 22 6e 65 77 62 72 22 20  x" name="newbr" 
16fb0 5c 0a 20 20 40 20 64 61 74 61 2d 62 72 61 6e 63  \.  @ data-branc
16fc0 68 3d 27 25 68 28 7a 42 72 61 6e 63 68 4e 61 6d  h='%h(zBranchNam
16fd0 65 29 27 25 73 28 7a 4e 65 77 42 72 46 6c 61 67  e)'%s(zNewBrFlag
16fe0 29 20 2f 3e 0a 20 20 40 20 4d 61 6b 65 20 74 68  ) />.  @ Make th
16ff0 69 73 20 63 68 65 63 6b 2d 69 6e 20 74 68 65 20  is check-in the 
17000 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77 20 62  start of a new b
17010 72 61 6e 63 68 20 6e 61 6d 65 64 3a 3c 2f 6c 61  ranch named:</la
17020 62 65 6c 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20  bel>.  @ <input 
17030 69 64 3d 22 62 72 6e 61 6d 65 22 20 74 79 70 65  id="brname" type
17040 3d 22 74 65 78 74 22 20 73 74 79 6c 65 3d 22 77  ="text" style="w
17050 69 64 74 68 3a 31 35 3b 22 20 6e 61 6d 65 3d 22  idth:15;" name="
17060 62 72 6e 61 6d 65 22 20 5c 0a 20 20 40 20 76 61  brname" \.  @ va
17070 6c 75 65 3d 22 25 68 28 7a 4e 65 77 42 72 61 6e  lue="%h(zNewBran
17080 63 68 29 22 20 2f 3e 3c 2f 74 64 3e 3c 2f 74 72  ch)" /></td></tr
17090 3e 0a 20 20 69 66 28 20 21 66 48 61 73 48 69 64  >.  if( !fHasHid
170a0 64 65 6e 20 29 7b 0a 20 20 20 20 40 20 3c 74 72  den ){.    @ <tr
170b0 3e 3c 74 68 20 61 6c 69 67 6e 3d 22 72 69 67 68  ><th align="righ
170c0 74 22 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e  t" valign="top">
170d0 42 72 61 6e 63 68 20 48 69 64 69 6e 67 3a 3c 2f  Branch Hiding:</
170e0 74 68 3e 0a 20 20 20 20 40 20 3c 74 64 20 76 61  th>.    @ <td va
170f0 6c 69 67 6e 3d 22 74 6f 70 22 3e 0a 20 20 20 20  lign="top">.    
17100 40 20 3c 6c 61 62 65 6c 3e 3c 69 6e 70 75 74 20  @ <label><input 
17110 74 79 70 65 3d 22 63 68 65 63 6b 62 6f 78 22 20  type="checkbox" 
17120 69 64 3d 22 68 69 64 65 62 72 22 20 6e 61 6d 65  id="hidebr" name
17130 3d 22 68 69 64 65 22 25 73 28 7a 48 69 64 65 46  ="hide"%s(zHideF
17140 6c 61 67 29 20 2f 3e 0a 20 20 20 20 40 20 48 69  lag) />.    @ Hi
17150 64 65 20 62 72 61 6e 63 68 0a 20 20 20 20 40 20  de branch.    @ 
17160 3c 73 70 61 6e 20 73 74 79 6c 65 3d 22 66 6f 6e  <span style="fon
17170 74 2d 77 65 69 67 68 74 3a 62 6f 6c 64 22 20 69  t-weight:bold" i
17180 64 3d 22 68 62 72 61 6e 63 68 22 3e 25 68 28 7a  d="hbranch">%h(z
17190 42 72 61 6e 63 68 4e 61 6d 65 29 3c 2f 73 70 61  BranchName)</spa
171a0 6e 3e 0a 20 20 20 20 40 20 66 72 6f 6d 20 74 68  n>.    @ from th
171b0 65 20 74 69 6d 65 6c 69 6e 65 20 73 74 61 72 74  e timeline start
171c0 69 6e 67 20 66 72 6f 6d 20 74 68 69 73 20 63 68  ing from this ch
171d0 65 63 6b 2d 69 6e 3c 2f 6c 61 62 65 6c 3e 0a 20  eck-in</label>. 
171e0 20 20 20 40 20 3c 2f 74 64 3e 3c 2f 74 72 3e 0a     @ </td></tr>.
171f0 20 20 7d 0a 20 20 69 66 28 20 21 66 48 61 73 43    }.  if( !fHasC
17200 6c 6f 73 65 64 20 29 7b 0a 20 20 20 20 69 66 28  losed ){.    if(
17210 20 69 73 5f 61 5f 6c 65 61 66 28 72 69 64 29 20   is_a_leaf(rid) 
17220 29 7b 0a 20 20 20 20 20 20 40 20 3c 74 72 3e 3c  ){.      @ <tr><
17230 74 68 20 61 6c 69 67 6e 3d 22 72 69 67 68 74 22  th align="right"
17240 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 4c 65   valign="top">Le
17250 61 66 20 43 6c 6f 73 75 72 65 3a 3c 2f 74 68 3e  af Closure:</th>
17260 0a 20 20 20 20 20 20 40 20 3c 74 64 20 76 61 6c  .      @ <td val
17270 69 67 6e 3d 22 74 6f 70 22 3e 0a 20 20 20 20 20  ign="top">.     
17280 20 40 20 3c 6c 61 62 65 6c 3e 3c 69 6e 70 75 74   @ <label><input
17290 20 74 79 70 65 3d 22 63 68 65 63 6b 62 6f 78 22   type="checkbox"
172a0 20 6e 61 6d 65 3d 22 63 6c 6f 73 65 22 25 73 28   name="close"%s(
172b0 7a 43 6c 6f 73 65 46 6c 61 67 29 20 2f 3e 0a 20  zCloseFlag) />. 
172c0 20 20 20 20 20 40 20 4d 61 72 6b 20 74 68 69 73       @ Mark this
172d0 20 6c 65 61 66 20 61 73 20 22 63 6c 6f 73 65 64   leaf as "closed
172e0 22 20 73 6f 20 74 68 61 74 20 69 74 20 6e 6f 20  " so that it no 
172f0 6c 6f 6e 67 65 72 20 61 70 70 65 61 72 73 20 6f  longer appears o
17300 6e 20 74 68 65 0a 20 20 20 20 20 20 40 20 22 6c  n the.      @ "l
17310 65 61 76 65 73 22 20 70 61 67 65 20 61 6e 64 20  eaves" page and 
17320 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6c 61 62  is no longer lab
17330 65 6c 65 64 20 61 73 20 61 20 22 3c 62 3e 4c 65  eled as a "<b>Le
17340 61 66 3c 2f 62 3e 22 3c 2f 6c 61 62 65 6c 3e 0a  af</b>"</label>.
17350 20 20 20 20 20 20 40 20 3c 2f 74 64 3e 3c 2f 74        @ </td></t
17360 72 3e 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  r>.    }else if(
17370 20 7a 42 72 61 6e 63 68 4e 61 6d 65 20 29 7b 0a   zBranchName ){.
17380 20 20 20 20 20 20 40 20 3c 74 72 3e 3c 74 68 20        @ <tr><th 
17390 61 6c 69 67 6e 3d 22 72 69 67 68 74 22 20 76 61  align="right" va
173a0 6c 69 67 6e 3d 22 74 6f 70 22 3e 42 72 61 6e 63  lign="top">Branc
173b0 68 20 43 6c 6f 73 75 72 65 3a 3c 2f 74 68 3e 0a  h Closure:</th>.
173c0 20 20 20 20 20 20 40 20 3c 74 64 20 76 61 6c 69        @ <td vali
173d0 67 6e 3d 22 74 6f 70 22 3e 0a 20 20 20 20 20 20  gn="top">.      
173e0 40 20 3c 6c 61 62 65 6c 3e 3c 69 6e 70 75 74 20  @ <label><input 
173f0 74 79 70 65 3d 22 63 68 65 63 6b 62 6f 78 22 20  type="checkbox" 
17400 6e 61 6d 65 3d 22 63 6c 6f 73 65 22 25 73 28 7a  name="close"%s(z
17410 43 6c 6f 73 65 46 6c 61 67 29 20 2f 3e 0a 20 20  CloseFlag) />.  
17420 20 20 20 20 40 20 4d 61 72 6b 20 62 72 61 6e 63      @ Mark branc
17430 68 0a 20 20 20 20 20 20 40 20 3c 73 70 61 6e 20  h.      @ <span 
17440 73 74 79 6c 65 3d 22 66 6f 6e 74 2d 77 65 69 67  style="font-weig
17450 68 74 3a 62 6f 6c 64 22 20 69 64 3d 22 63 62 72  ht:bold" id="cbr
17460 61 6e 63 68 22 3e 25 68 28 7a 42 72 61 6e 63 68  anch">%h(zBranch
17470 4e 61 6d 65 29 3c 2f 73 70 61 6e 3e 0a 20 20 20  Name)</span>.   
17480 20 20 20 40 20 61 73 20 22 63 6c 6f 73 65 64 22     @ as "closed"
17490 2e 3c 2f 6c 61 62 65 6c 3e 0a 20 20 20 20 20 20  .</label>.      
174a0 40 20 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 20  @ </td></tr>.   
174b0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 42 72   }.  }.  if( zBr
174c0 61 6e 63 68 4e 61 6d 65 20 29 20 66 6f 73 73 69  anchName ) fossi
174d0 6c 5f 66 72 65 65 28 7a 42 72 61 6e 63 68 4e 61  l_free(zBranchNa
174e0 6d 65 29 3b 0a 0a 0a 20 20 40 20 3c 74 72 3e 3c  me);...  @ <tr><
174f0 74 64 20 63 6f 6c 73 70 61 6e 3d 22 32 22 3e 0a  td colspan="2">.
17500 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d    @ <input type=
17510 22 73 75 62 6d 69 74 22 20 6e 61 6d 65 3d 22 63  "submit" name="c
17520 61 6e 63 65 6c 22 20 76 61 6c 75 65 3d 22 43 61  ancel" value="Ca
17530 6e 63 65 6c 22 20 2f 3e 0a 20 20 40 20 3c 69 6e  ncel" />.  @ <in
17540 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69 74  put type="submit
17550 22 20 6e 61 6d 65 3d 22 70 72 65 76 69 65 77 22  " name="preview"
17560 20 76 61 6c 75 65 3d 22 50 72 65 76 69 65 77 22   value="Preview"
17570 20 2f 3e 0a 20 20 69 66 28 20 50 28 22 70 72 65   />.  if( P("pre
17580 76 69 65 77 22 29 20 29 7b 0a 20 20 20 20 40 20  view") ){.    @ 
17590 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62  <input type="sub
175a0 6d 69 74 22 20 6e 61 6d 65 3d 22 61 70 70 6c 79  mit" name="apply
175b0 22 20 76 61 6c 75 65 3d 22 41 70 70 6c 79 20 43  " value="Apply C
175c0 68 61 6e 67 65 73 22 20 2f 3e 0a 20 20 7d 0a 20  hanges" />.  }. 
175d0 20 40 20 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20   @ </td></tr>.  
175e0 40 20 3c 2f 74 61 62 6c 65 3e 0a 20 20 40 20 3c  @ </table>.  @ <
175f0 2f 64 69 76 3e 3c 2f 66 6f 72 6d 3e 0a 20 20 73  /div></form>.  s
17600 74 79 6c 65 5f 6c 6f 61 64 5f 6f 6e 65 5f 6a 73  tyle_load_one_js
17610 5f 66 69 6c 65 28 22 63 69 5f 65 64 69 74 2e 6a  _file("ci_edit.j
17620 73 22 29 3b 0a 20 20 73 74 79 6c 65 5f 66 6f 6f  s");.  style_foo
17630 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ter();.}../*.** 
17640 50 72 65 70 61 72 65 20 61 6e 20 61 6d 6d 65 6e  Prepare an ammen
17650 64 65 64 20 63 6f 6d 6d 69 74 20 63 6f 6d 6d 65  ded commit comme
17660 6e 74 2e 20 20 4c 65 74 20 74 68 65 20 75 73 65  nt.  Let the use
17670 72 20 6d 6f 64 69 66 79 20 69 74 20 75 73 69 6e  r modify it usin
17680 67 20 74 68 65 0a 2a 2a 20 65 64 69 74 6f 72 20  g the.** editor 
17690 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
176a0 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67 20 74   global_config t
176b0 61 62 6c 65 20 6f 72 20 65 69 74 68 65 72 0a 2a  able or either.*
176c0 2a 20 74 68 65 20 56 49 53 55 41 4c 20 6f 72 20  * the VISUAL or 
176d0 45 44 49 54 4f 52 20 65 6e 76 69 72 6f 6e 6d 65  EDITOR environme
176e0 6e 74 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2a 0a  nt variable..**.
176f0 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 66 69 6e  ** Store the fin
17700 61 6c 20 63 6f 6d 6d 69 74 20 63 6f 6d 6d 65 6e  al commit commen
17710 74 20 69 6e 20 70 43 6f 6d 6d 65 6e 74 2e 20 20  t in pComment.  
17720 70 43 6f 6d 6d 65 6e 74 20 69 73 20 61 73 73 75  pComment is assu
17730 6d 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69  med.** to be uni
17740 6e 69 74 69 61 6c 69 7a 65 64 20 2d 20 61 6e 79  nitialized - any
17750 20 70 72 69 6f 72 20 63 6f 6e 74 65 6e 74 20 69   prior content i
17760 73 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a  s overwritten..*
17770 2a 0a 2a 2a 20 55 73 65 20 7a 49 6e 69 74 20 74  *.** Use zInit t
17780 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
17790 20 63 68 65 63 6b 2d 69 6e 20 63 6f 6d 6d 65 6e   check-in commen
177a0 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 75 73  t so that the us
177b0 65 72 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 68  er does.** not h
177c0 61 76 65 20 74 6f 20 72 65 74 79 70 65 2e 0a 2a  ave to retype..*
177d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  /.static void pr
177e0 65 70 61 72 65 5f 61 6d 65 6e 64 5f 63 6f 6d 6d  epare_amend_comm
177f0 65 6e 74 28 0a 20 20 42 6c 6f 62 20 2a 70 43 6f  ent(.  Blob *pCo
17800 6d 6d 65 6e 74 2c 0a 20 20 63 6f 6e 73 74 20 63  mment,.  const c
17810 68 61 72 20 2a 7a 49 6e 69 74 2c 0a 20 20 63 6f  har *zInit,.  co
17820 6e 73 74 20 63 68 61 72 20 2a 7a 55 75 69 64 0a  nst char *zUuid.
17830 29 7b 0a 20 20 42 6c 6f 62 20 70 72 6f 6d 70 74  ){.  Blob prompt
17840 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  ;.#if defined(_W
17850 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
17860 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69  (__CYGWIN__).  i
17870 6e 74 20 62 6f 6d 53 69 7a 65 3b 0a 20 20 63 6f  nt bomSize;.  co
17880 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
17890 72 20 2a 62 6f 6d 20 3d 20 67 65 74 5f 75 74 66  r *bom = get_utf
178a0 38 5f 62 6f 6d 28 26 62 6f 6d 53 69 7a 65 29 3b  8_bom(&bomSize);
178b0 0a 20 20 62 6c 6f 62 5f 69 6e 69 74 28 26 70 72  .  blob_init(&pr
178c0 6f 6d 70 74 2c 20 28 63 6f 6e 73 74 20 63 68 61  ompt, (const cha
178d0 72 20 2a 29 20 62 6f 6d 2c 20 62 6f 6d 53 69 7a  r *) bom, bomSiz
178e0 65 29 3b 0a 20 20 69 66 28 20 7a 49 6e 69 74 20  e);.  if( zInit 
178f0 26 26 20 7a 49 6e 69 74 5b 30 5d 29 7b 0a 20 20  && zInit[0]){.  
17900 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 70    blob_append(&p
17910 72 6f 6d 70 74 2c 20 7a 49 6e 69 74 2c 20 2d 31  rompt, zInit, -1
17920 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 62  );.  }.#else.  b
17930 6c 6f 62 5f 69 6e 69 74 28 26 70 72 6f 6d 70 74  lob_init(&prompt
17940 2c 20 7a 49 6e 69 74 2c 20 2d 31 29 3b 0a 23 65  , zInit, -1);.#e
17950 6e 64 69 66 0a 20 20 62 6c 6f 62 5f 61 70 70 65  ndif.  blob_appe
17960 6e 64 28 26 70 72 6f 6d 70 74 2c 20 22 5c 6e 23  nd(&prompt, "\n#
17970 20 45 6e 74 65 72 20 61 20 6e 65 77 20 63 6f 6d   Enter a new com
17980 6d 65 6e 74 20 66 6f 72 20 63 68 65 63 6b 2d 69  ment for check-i
17990 6e 20 22 2c 20 2d 31 29 3b 0a 20 20 69 66 28 20  n ", -1);.  if( 
179a0 7a 55 75 69 64 20 26 26 20 7a 55 75 69 64 5b 30  zUuid && zUuid[0
179b0 5d 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70  ] ){.    blob_ap
179c0 70 65 6e 64 28 26 70 72 6f 6d 70 74 2c 20 7a 55  pend(&prompt, zU
179d0 75 69 64 2c 20 2d 31 29 3b 0a 20 20 7d 0a 20 20  uid, -1);.  }.  
179e0 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 70 72 6f  blob_append(&pro
179f0 6d 70 74 2c 20 22 2e 5c 6e 23 20 4c 69 6e 65 73  mpt, ".\n# Lines
17a00 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
17a10 61 20 23 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  a # are ignored.
17a20 5c 6e 22 2c 20 2d 31 29 3b 0a 20 20 70 72 6f 6d  \n", -1);.  prom
17a30 70 74 5f 66 6f 72 5f 75 73 65 72 5f 63 6f 6d 6d  pt_for_user_comm
17a40 65 6e 74 28 70 43 6f 6d 6d 65 6e 74 2c 20 26 70  ent(pComment, &p
17a50 72 6f 6d 70 74 29 3b 0a 20 20 62 6c 6f 62 5f 72  rompt);.  blob_r
17a60 65 73 65 74 28 26 70 72 6f 6d 70 74 29 3b 0a 7d  eset(&prompt);.}
17a70 0a 0a 23 64 65 66 69 6e 65 20 41 4d 45 4e 44 5f  ..#define AMEND_
17a80 55 53 41 47 45 5f 53 54 4d 54 20 22 55 55 49 44  USAGE_STMT "UUID
17a90 20 4f 50 54 49 4f 4e 20 3f 4f 50 54 49 4f 4e 20   OPTION ?OPTION 
17aa0 2e 2e 2e 3f 22 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d  ...?"./*.** COMM
17ab0 41 4e 44 3a 20 61 6d 65 6e 64 0a 2a 2a 0a 2a 2a  AND: amend.**.**
17ac0 20 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20   Usage: %fossil 
17ad0 61 6d 65 6e 64 20 55 55 49 44 20 4f 50 54 49 4f  amend UUID OPTIO
17ae0 4e 20 3f 4f 50 54 49 4f 4e 20 2e 2e 2e 3f 0a 2a  N ?OPTION ...?.*
17af0 2a 0a 2a 2a 20 41 6d 65 6e 64 20 74 68 65 20 74  *.** Amend the t
17b00 61 67 73 20 6f 6e 20 63 68 65 63 6b 2d 69 6e 20  ags on check-in 
17b10 55 55 49 44 20 74 6f 20 63 68 61 6e 67 65 20 68  UUID to change h
17b20 6f 77 20 69 74 20 64 69 73 70 6c 61 79 73 20 69  ow it displays i
17b30 6e 20 74 68 65 20 74 69 6d 65 6c 69 6e 65 2e 0a  n the timeline..
17b40 2a 2a 0a 2a 2a 20 4f 70 74 69 6f 6e 73 3a 0a 2a  **.** Options:.*
17b50 2a 0a 2a 2a 20 20 20 20 2d 2d 61 75 74 68 6f 72  *.**    --author
17b60 20 55 53 45 52 20 20 20 20 20 20 20 20 20 20 20   USER           
17b70 4d 61 6b 65 20 55 53 45 52 20 74 68 65 20 61 75  Make USER the au
17b80 74 68 6f 72 20 66 6f 72 20 63 68 65 63 6b 2d 69  thor for check-i
17b90 6e 0a 2a 2a 20 20 20 20 2d 6d 7c 2d 2d 63 6f 6d  n.**    -m|--com
17ba0 6d 65 6e 74 20 43 4f 4d 4d 45 4e 54 20 20 20 20  ment COMMENT    
17bb0 4d 61 6b 65 20 43 4f 4d 4d 45 4e 54 20 74 68 65  Make COMMENT the
17bc0 20 63 68 65 63 6b 2d 69 6e 20 63 6f 6d 6d 65 6e   check-in commen
17bd0 74 0a 2a 2a 20 20 20 20 2d 4d 7c 2d 2d 6d 65 73  t.**    -M|--mes
17be0 73 61 67 65 2d 66 69 6c 65 20 46 49 4c 45 20 20  sage-file FILE  
17bf0 52 65 61 64 20 74 68 65 20 61 6d 65 6e 64 65 64  Read the amended
17c00 20 63 6f 6d 6d 65 6e 74 20 66 72 6f 6d 20 46 49   comment from FI
17c10 4c 45 0a 2a 2a 20 20 20 20 2d 65 7c 2d 2d 65 64  LE.**    -e|--ed
17c20 69 74 2d 63 6f 6d 6d 65 6e 74 20 20 20 20 20 20  it-comment      
17c30 20 4c 61 75 6e 63 68 20 65 64 69 74 6f 72 20 74   Launch editor t
17c40 6f 20 72 65 76 69 73 65 20 63 6f 6d 6d 65 6e 74  o revise comment
17c50 0a 2a 2a 20 20 20 20 2d 2d 64 61 74 65 20 44 41  .**    --date DA
17c60 54 45 54 49 4d 45 20 20 20 20 20 20 20 20 20 4d  TETIME         M
17c70 61 6b 65 20 44 41 54 45 54 49 4d 45 20 74 68 65  ake DATETIME the
17c80 20 63 68 65 63 6b 2d 69 6e 20 74 69 6d 65 0a 2a   check-in time.*
17c90 2a 20 20 20 20 2d 2d 62 67 63 6f 6c 6f 72 20 43  *    --bgcolor C
17ca0 4f 4c 4f 52 20 20 20 20 20 20 20 20 20 41 70 70  OLOR         App
17cb0 6c 79 20 43 4f 4c 4f 52 20 74 6f 20 74 68 69 73  ly COLOR to this
17cc0 20 63 68 65 63 6b 2d 69 6e 0a 2a 2a 20 20 20 20   check-in.**    
17cd0 2d 2d 62 72 61 6e 63 68 63 6f 6c 6f 72 20 43 4f  --branchcolor CO
17ce0 4c 4f 52 20 20 20 20 20 41 70 70 6c 79 20 61 6e  LOR     Apply an
17cf0 64 20 70 72 6f 70 61 67 61 74 65 20 43 4f 4c 4f  d propagate COLO
17d00 52 20 74 6f 20 74 68 65 20 62 72 61 6e 63 68 0a  R to the branch.
17d10 2a 2a 20 20 20 20 2d 2d 74 61 67 20 54 41 47 20  **    --tag TAG 
17d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 64                Ad
17d30 64 20 6e 65 77 20 54 41 47 20 74 6f 20 74 68 69  d new TAG to thi
17d40 73 20 63 68 65 63 6b 2d 69 6e 0a 2a 2a 20 20 20  s check-in.**   
17d50 20 2d 2d 63 61 6e 63 65 6c 20 54 41 47 20 20 20   --cancel TAG   
17d60 20 20 20 20 20 20 20 20 20 43 61 6e 63 65 6c 20           Cancel 
17d70 54 41 47 20 66 72 6f 6d 20 74 68 69 73 20 63 68  TAG from this ch
17d80 65 63 6b 2d 69 6e 0a 2a 2a 20 20 20 20 2d 2d 62  eck-in.**    --b
17d90 72 61 6e 63 68 20 4e 41 4d 45 20 20 20 20 20 20  ranch NAME      
17da0 20 20 20 20 20 4d 61 6b 65 20 74 68 69 73 20 63       Make this c
17db0 68 65 63 6b 2d 69 6e 20 74 68 65 20 73 74 61 72  heck-in the star
17dc0 74 20 6f 66 20 62 72 61 6e 63 68 20 4e 41 4d 45  t of branch NAME
17dd0 0a 2a 2a 20 20 20 20 2d 2d 68 69 64 65 20 20 20  .**    --hide   
17de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 48                 H
17df0 69 64 65 20 62 72 61 6e 63 68 20 73 74 61 72 74  ide branch start
17e00 69 6e 67 20 66 72 6f 6d 20 74 68 69 73 20 63 68  ing from this ch
17e10 65 63 6b 2d 69 6e 0a 2a 2a 20 20 20 20 2d 2d 63  eck-in.**    --c
17e20 6c 6f 73 65 20 20 20 20 20 20 20 20 20 20 20 20  lose            
17e30 20 20 20 20 20 4d 61 72 6b 20 74 68 69 73 20 22       Mark this "
17e40 6c 65 61 66 22 20 61 73 20 63 6c 6f 73 65 64 0a  leaf" as closed.
17e50 2a 2a 20 20 20 20 2d 6e 7c 2d 2d 64 72 79 2d 72  **    -n|--dry-r
17e60 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 50 72  un            Pr
17e70 69 6e 74 20 63 6f 6e 74 72 6f 6c 20 61 72 74 69  int control arti
17e80 66 61 63 74 2c 20 62 75 74 20 6d 61 6b 65 20 6e  fact, but make n
17e90 6f 20 63 68 61 6e 67 65 73 0a 2a 2a 20 20 20 20  o changes.**    
17ea0 2d 2d 64 61 74 65 2d 6f 76 65 72 72 69 64 65 20  --date-override 
17eb0 44 41 54 45 54 49 4d 45 20 20 53 65 74 20 74 68  DATETIME  Set th
17ec0 65 20 63 68 61 6e 67 65 20 74 69 6d 65 20 6f 6e  e change time on
17ed0 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 61 72 74   the control art
17ee0 69 66 61 63 74 0a 2a 2a 20 20 20 20 2d 2d 75 73  ifact.**    --us
17ef0 65 72 2d 6f 76 65 72 72 69 64 65 20 55 53 45 52  er-override USER
17f00 20 20 20 20 20 20 53 65 74 20 74 68 65 20 75 73        Set the us
17f10 65 72 20 6e 61 6d 65 20 6f 6e 20 74 68 65 20 63  er name on the c
17f20 6f 6e 74 72 6f 6c 20 61 72 74 69 66 61 63 74 0a  ontrol artifact.
17f30 2a 2a 0a 2a 2a 20 44 41 54 45 54 49 4d 45 20 6d  **.** DATETIME m
17f40 61 79 20 62 65 20 22 6e 6f 77 22 20 6f 72 20 22  ay be "now" or "
17f50 59 59 59 59 2d 4d 4d 2d 44 44 54 48 48 3a 4d 4d  YYYY-MM-DDTHH:MM
17f60 3a 53 53 2e 53 53 53 22 2e 20 49 66 20 69 6e 0a  :SS.SSS". If in.
17f70 2a 2a 20 79 65 61 72 2d 6d 6f 6e 74 68 2d 64 61  ** year-month-da
17f80 79 20 66 6f 72 6d 2c 20 69 74 20 6d 61 79 20 62  y form, it may b
17f90 65 20 74 72 75 6e 63 61 74 65 64 2c 20 74 68 65  e truncated, the
17fa0 20 22 54 22 20 6d 61 79 20 62 65 20 72 65 70 6c   "T" may be repl
17fb0 61 63 65 64 20 62 79 0a 2a 2a 20 61 20 73 70 61  aced by.** a spa
17fc0 63 65 2c 20 61 6e 64 20 69 74 20 6d 61 79 20 61  ce, and it may a
17fd0 6c 73 6f 20 6e 61 6d 65 20 61 20 74 69 6d 65 7a  lso name a timez
17fe0 6f 6e 65 20 6f 66 66 73 65 74 20 66 72 6f 6d 20  one offset from 
17ff0 55 54 43 20 61 73 20 22 2d 48 48 3a 4d 4d 22 0a  UTC as "-HH:MM".
18000 2a 2a 20 28 77 65 73 74 77 61 72 64 29 20 6f 72  ** (westward) or
18010 20 22 2b 48 48 3a 4d 4d 22 20 28 65 61 73 74 77   "+HH:MM" (eastw
18020 61 72 64 29 2e 20 45 69 74 68 65 72 20 6e 6f 20  ard). Either no 
18030 74 69 6d 65 7a 6f 6e 65 20 73 75 66 66 69 78 20  timezone suffix 
18040 6f 72 20 22 5a 22 0a 2a 2a 20 6d 65 61 6e 73 20  or "Z".** means 
18050 55 54 43 2e 0a 2a 2f 0a 76 6f 69 64 20 63 69 5f  UTC..*/.void ci_
18060 61 6d 65 6e 64 5f 63 6d 64 28 76 6f 69 64 29 7b  amend_cmd(void){
18070 0a 20 20 69 6e 74 20 72 69 64 3b 0a 20 20 63 6f  .  int rid;.  co
18080 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 65  nst char *zComme
18090 6e 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  nt;         /* C
180a0 75 72 72 65 6e 74 20 63 6f 6d 6d 65 6e 74 20 6f  urrent comment o
180b0 6e 20 74 68 65 20 63 68 65 63 6b 2d 69 6e 20 2a  n the check-in *
180c0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
180d0 7a 4e 65 77 43 6f 6d 6d 65 6e 74 3b 20 20 20 20  zNewComment;    
180e0 20 20 2f 2a 20 52 65 76 69 73 65 64 20 63 68 65    /* Revised che
180f0 63 6b 2d 69 6e 20 63 6f 6d 6d 65 6e 74 20 2a 2f  ck-in comment */
18100 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18110 43 6f 6d 46 69 6c 65 3b 20 20 20 20 20 20 20 20  ComFile;        
18120 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 66 72 6f   /* Filename fro
18130 6d 20 77 68 69 63 68 20 74 6f 20 72 65 61 64 20  m which to read 
18140 63 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e  comment */.  con
18150 73 74 20 63 68 61 72 20 2a 7a 55 73 65 72 3b 20  st char *zUser; 
18160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
18170 72 72 65 6e 74 20 75 73 65 72 20 66 6f 72 20 74  rrent user for t
18180 68 65 20 63 68 65 63 6b 2d 69 6e 20 2a 2f 0a 20  he check-in */. 
18190 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65   const char *zNe
181a0 77 55 73 65 72 3b 20 20 20 20 20 20 20 20 20 2f  wUser;         /
181b0 2a 20 52 65 76 69 73 65 64 20 75 73 65 72 20 2a  * Revised user *
181c0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
181d0 7a 44 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  zDate;          
181e0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 64 61 74    /* Current dat
181f0 65 20 6f 66 20 74 68 65 20 63 68 65 63 6b 2d 69  e of the check-i
18200 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
18210 72 20 2a 7a 4e 65 77 44 61 74 65 3b 20 20 20 20  r *zNewDate;    
18220 20 20 20 20 20 2f 2a 20 52 65 76 69 73 65 64 20       /* Revised 
18230 63 68 65 63 6b 2d 69 6e 20 64 61 74 65 20 2a 2f  check-in date */
18240 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18250 43 6f 6c 6f 72 3b 0a 20 20 63 6f 6e 73 74 20 63  Color;.  const c
18260 68 61 72 20 2a 7a 4e 65 77 43 6f 6c 6f 72 3b 0a  har *zNewColor;.
18270 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
18280 65 77 42 72 43 6f 6c 6f 72 3b 0a 20 20 63 6f 6e  ewBrColor;.  con
18290 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 42 72 61  st char *zNewBra
182a0 6e 63 68 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  nch;.  const cha
182b0 72 20 2a 2a 70 7a 4e 65 77 54 61 67 73 20 3d 20  r **pzNewTags = 
182c0 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  0;.  const char 
182d0 2a 2a 70 7a 43 61 6e 63 65 6c 54 61 67 73 20 3d  **pzCancelTags =
182e0 20 30 3b 0a 20 20 69 6e 74 20 66 43 6c 6f 73 65   0;.  int fClose
182f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18300 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6c      /* True if l
18310 65 61 66 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  eaf should be cl
18320 6f 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 48  osed */.  int fH
18330 69 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ide;            
18340 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
18350 69 66 20 62 72 61 6e 63 68 20 73 68 6f 75 6c 64  if branch should
18360 20 62 65 20 68 69 64 64 65 6e 20 2a 2f 0a 20 20   be hidden */.  
18370 69 6e 74 20 66 50 72 6f 70 61 67 61 74 65 43 6f  int fPropagateCo
18380 6c 6f 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  lor;          /*
18390 20 54 72 75 65 20 69 66 20 63 6f 6c 6f 72 20 70   True if color p
183a0 72 6f 70 61 67 61 74 65 73 20 62 65 66 6f 72 65  ropagates before
183b0 20 61 6d 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20   amend */.  int 
183c0 66 4e 65 77 50 72 6f 70 61 67 61 74 65 43 6f 6c  fNewPropagateCol
183d0 6f 72 20 3d 20 30 3b 20 20 20 2f 2a 20 54 72 75  or = 0;   /* Tru
183e0 65 20 69 66 20 63 6f 6c 6f 72 20 70 72 6f 70 61  e if color propa
183f0 67 61 74 65 73 20 61 66 74 65 72 20 61 6d 65 6e  gates after amen
18400 64 20 2a 2f 0a 20 20 69 6e 74 20 66 48 61 73 48  d */.  int fHasH
18410 69 64 64 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  idden = 0;      
18420 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
18430 68 69 64 64 65 6e 20 74 61 67 20 61 6c 72 65 61  hidden tag alrea
18440 64 79 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  dy set */.  int 
18450 66 48 61 73 43 6c 6f 73 65 64 20 3d 20 30 3b 20  fHasClosed = 0; 
18460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
18470 65 20 69 66 20 63 6c 6f 73 65 64 20 74 61 67 20  e if closed tag 
18480 61 6c 72 65 61 64 79 20 73 65 74 20 2a 2f 0a 20  already set */. 
18490 20 69 6e 74 20 66 45 64 69 74 43 6f 6d 6d 65 6e   int fEditCommen
184a0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
184b0 2a 20 54 72 75 65 20 69 66 20 65 64 69 74 6f 72  * True if editor
184c0 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
184d0 63 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  comment */.  int
184e0 20 66 44 72 79 52 75 6e 3b 20 20 20 20 20 20 20   fDryRun;       
184f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
18500 69 6e 74 20 63 6f 6e 74 72 6f 6c 20 61 72 74 69  int control arti
18510 66 61 63 74 2c 20 6d 61 6b 65 20 6e 6f 20 63 68  fact, make no ch
18520 61 6e 67 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  anges */.  const
18530 20 63 68 61 72 20 2a 7a 43 68 6e 67 54 69 6d 65   char *zChngTime
18540 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
18550 63 68 61 6e 67 65 20 74 69 6d 65 20 6f 6e 20 74  change time on t
18560 68 65 20 63 6f 6e 74 72 6f 6c 20 61 72 74 69 66  he control artif
18570 61 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  act */.  const c
18580 68 61 72 20 2a 7a 55 73 65 72 4f 76 72 64 3b 20  har *zUserOvrd; 
18590 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 73         /* The us
185a0 65 72 20 6e 61 6d 65 20 6f 6e 20 74 68 65 20 63  er name on the c
185b0 6f 6e 74 72 6f 6c 20 61 72 74 69 66 61 63 74 20  ontrol artifact 
185c0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
185d0 2a 7a 55 75 69 64 3b 0a 20 20 42 6c 6f 62 20 63  *zUuid;.  Blob c
185e0 74 72 6c 3b 0a 20 20 42 6c 6f 62 20 63 6f 6d 6d  trl;.  Blob comm
185f0 65 6e 74 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 6f  ent;.  char *zNo
18600 77 3b 0a 20 20 69 6e 74 20 6e 54 61 67 73 2c 20  w;.  int nTags, 
18610 6e 43 61 6e 63 65 6c 73 3b 0a 20 20 69 6e 74 20  nCancels;.  int 
18620 69 3b 0a 20 20 53 74 6d 74 20 71 3b 0a 0a 20 20  i;.  Stmt q;..  
18630 69 66 28 20 67 2e 61 72 67 63 3d 3d 33 20 29 20  if( g.argc==3 ) 
18640 75 73 61 67 65 28 41 4d 45 4e 44 5f 55 53 41 47  usage(AMEND_USAG
18650 45 5f 53 54 4d 54 29 3b 0a 20 20 66 45 64 69 74  E_STMT);.  fEdit
18660 43 6f 6d 6d 65 6e 74 20 3d 20 66 69 6e 64 5f 6f  Comment = find_o
18670 70 74 69 6f 6e 28 22 65 64 69 74 2d 63 6f 6d 6d  ption("edit-comm
18680 65 6e 74 22 2c 22 65 22 2c 30 29 21 3d 30 3b 0a  ent","e",0)!=0;.
18690 20 20 7a 4e 65 77 43 6f 6d 6d 65 6e 74 20 3d 20    zNewComment = 
186a0 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 63 6f 6d  find_option("com
186b0 6d 65 6e 74 22 2c 22 6d 22 2c 31 29 3b 0a 20 20  ment","m",1);.  
186c0 7a 43 6f 6d 46 69 6c 65 20 3d 20 66 69 6e 64 5f  zComFile = find_
186d0 6f 70 74 69 6f 6e 28 22 6d 65 73 73 61 67 65 2d  option("message-
186e0 66 69 6c 65 22 2c 22 4d 22 2c 31 29 3b 0a 20 20  file","M",1);.  
186f0 7a 4e 65 77 42 72 61 6e 63 68 20 3d 20 66 69 6e  zNewBranch = fin
18700 64 5f 6f 70 74 69 6f 6e 28 22 62 72 61 6e 63 68  d_option("branch
18710 22 2c 30 2c 31 29 3b 0a 20 20 7a 4e 65 77 43 6f  ",0,1);.  zNewCo
18720 6c 6f 72 20 3d 20 66 69 6e 64 5f 6f 70 74 69 6f  lor = find_optio
18730 6e 28 22 62 67 63 6f 6c 6f 72 22 2c 30 2c 31 29  n("bgcolor",0,1)
18740 3b 0a 20 20 7a 4e 65 77 42 72 43 6f 6c 6f 72 20  ;.  zNewBrColor 
18750 3d 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 62  = find_option("b
18760 72 61 6e 63 68 63 6f 6c 6f 72 22 2c 30 2c 31 29  ranchcolor",0,1)
18770 3b 0a 20 20 69 66 28 20 7a 4e 65 77 42 72 43 6f  ;.  if( zNewBrCo
18780 6c 6f 72 20 29 7b 0a 20 20 20 20 7a 4e 65 77 43  lor ){.    zNewC
18790 6f 6c 6f 72 20 3d 20 7a 4e 65 77 42 72 43 6f 6c  olor = zNewBrCol
187a0 6f 72 3b 0a 20 20 20 20 66 4e 65 77 50 72 6f 70  or;.    fNewProp
187b0 61 67 61 74 65 43 6f 6c 6f 72 20 3d 20 31 3b 0a  agateColor = 1;.
187c0 20 20 7d 0a 20 20 7a 4e 65 77 44 61 74 65 20 3d    }.  zNewDate =
187d0 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 64 61   find_option("da
187e0 74 65 22 2c 30 2c 31 29 3b 0a 20 20 7a 4e 65 77  te",0,1);.  zNew
187f0 55 73 65 72 20 3d 20 66 69 6e 64 5f 6f 70 74 69  User = find_opti
18800 6f 6e 28 22 61 75 74 68 6f 72 22 2c 30 2c 31 29  on("author",0,1)
18810 3b 0a 20 20 70 7a 4e 65 77 54 61 67 73 20 3d 20  ;.  pzNewTags = 
18820 66 69 6e 64 5f 72 65 70 65 61 74 61 62 6c 65 5f  find_repeatable_
18830 6f 70 74 69 6f 6e 28 22 74 61 67 22 2c 30 2c 26  option("tag",0,&
18840 6e 54 61 67 73 29 3b 0a 20 20 70 7a 43 61 6e 63  nTags);.  pzCanc
18850 65 6c 54 61 67 73 20 3d 20 66 69 6e 64 5f 72 65  elTags = find_re
18860 70 65 61 74 61 62 6c 65 5f 6f 70 74 69 6f 6e 28  peatable_option(
18870 22 63 61 6e 63 65 6c 22 2c 30 2c 26 6e 43 61 6e  "cancel",0,&nCan
18880 63 65 6c 73 29 3b 0a 20 20 66 43 6c 6f 73 65 20  cels);.  fClose 
18890 3d 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 63  = find_option("c
188a0 6c 6f 73 65 22 2c 30 2c 30 29 21 3d 30 3b 0a 20  lose",0,0)!=0;. 
188b0 20 66 48 69 64 65 20 3d 20 66 69 6e 64 5f 6f 70   fHide = find_op
188c0 74 69 6f 6e 28 22 68 69 64 65 22 2c 30 2c 30 29  tion("hide",0,0)
188d0 21 3d 30 3b 0a 20 20 66 44 72 79 52 75 6e 20 3d  !=0;.  fDryRun =
188e0 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 64 72   find_option("dr
188f0 79 2d 72 75 6e 22 2c 22 6e 22 2c 30 29 21 3d 30  y-run","n",0)!=0
18900 3b 0a 20 20 69 66 28 20 66 44 72 79 52 75 6e 3d  ;.  if( fDryRun=
18910 3d 30 20 29 20 66 44 72 79 52 75 6e 20 3d 20 66  =0 ) fDryRun = f
18920 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 64 72 79 72  ind_option("dryr
18930 75 6e 22 2c 22 6e 22 2c 30 29 21 3d 30 3b 0a 20  un","n",0)!=0;. 
18940 20 7a 43 68 6e 67 54 69 6d 65 20 3d 20 66 69 6e   zChngTime = fin
18950 64 5f 6f 70 74 69 6f 6e 28 22 64 61 74 65 2d 6f  d_option("date-o
18960 76 65 72 72 69 64 65 22 2c 30 2c 31 29 3b 0a 20  verride",0,1);. 
18970 20 69 66 28 20 7a 43 68 6e 67 54 69 6d 65 3d 3d   if( zChngTime==
18980 30 20 29 20 7a 43 68 6e 67 54 69 6d 65 20 3d 20  0 ) zChngTime = 
18990 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 63 68 6e  find_option("chn
189a0 67 74 69 6d 65 22 2c 30 2c 31 29 3b 0a 20 20 7a  gtime",0,1);.  z
189b0 55 73 65 72 4f 76 72 64 20 3d 20 66 69 6e 64 5f  UserOvrd = find_
189c0 6f 70 74 69 6f 6e 28 22 75 73 65 72 2d 6f 76 65  option("user-ove
189d0 72 72 69 64 65 22 2c 30 2c 31 29 3b 0a 20 20 64  rride",0,1);.  d
189e0 62 5f 66 69 6e 64 5f 61 6e 64 5f 6f 70 65 6e 5f  b_find_and_open_
189f0 72 65 70 6f 73 69 74 6f 72 79 28 30 2c 30 29 3b  repository(0,0);
18a00 0a 20 20 75 73 65 72 5f 73 65 6c 65 63 74 28 29  .  user_select()
18a10 3b 0a 20 20 76 65 72 69 66 79 5f 61 6c 6c 5f 6f  ;.  verify_all_o
18a20 70 74 69 6f 6e 73 28 29 3b 0a 20 20 69 66 28 20  ptions();.  if( 
18a30 67 2e 61 72 67 63 3c 33 20 7c 7c 20 67 2e 61 72  g.argc<3 || g.ar
18a40 67 63 3e 3d 34 20 29 20 75 73 61 67 65 28 41 4d  gc>=4 ) usage(AM
18a50 45 4e 44 5f 55 53 41 47 45 5f 53 54 4d 54 29 3b  END_USAGE_STMT);
18a60 0a 20 20 72 69 64 20 3d 20 6e 61 6d 65 5f 74 6f  .  rid = name_to
18a70 5f 74 79 70 65 64 5f 72 69 64 28 67 2e 61 72 67  _typed_rid(g.arg
18a80 76 5b 32 5d 2c 20 22 63 69 22 29 3b 0a 20 20 69  v[2], "ci");.  i
18a90 66 28 20 72 69 64 3d 3d 30 20 26 26 20 21 69 73  f( rid==0 && !is
18aa0 5f 61 5f 76 65 72 73 69 6f 6e 28 72 69 64 29 20  _a_version(rid) 
18ab0 29 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22  ) fossil_fatal("
18ac0 6e 6f 20 73 75 63 68 20 63 68 65 63 6b 2d 69 6e  no such check-in
18ad0 22 29 3b 0a 20 20 7a 55 75 69 64 20 3d 20 64 62  ");.  zUuid = db
18ae0 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54  _text(0, "SELECT
18af0 20 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62 20   uuid FROM blob 
18b00 57 48 45 52 45 20 72 69 64 3d 25 64 22 2c 20 72  WHERE rid=%d", r
18b10 69 64 29 3b 0a 20 20 69 66 28 20 7a 55 75 69 64  id);.  if( zUuid
18b20 3d 3d 30 20 29 20 66 6f 73 73 69 6c 5f 66 61 74  ==0 ) fossil_fat
18b30 61 6c 28 22 55 6e 61 62 6c 65 20 74 6f 20 66 69  al("Unable to fi
18b40 6e 64 20 55 55 49 44 22 29 3b 0a 20 20 7a 43 6f  nd UUID");.  zCo
18b50 6d 6d 65 6e 74 20 3d 20 64 62 5f 74 65 78 74 28  mment = db_text(
18b60 30 2c 20 22 53 45 4c 45 43 54 20 63 6f 61 6c 65  0, "SELECT coale
18b70 73 63 65 28 65 63 6f 6d 6d 65 6e 74 2c 63 6f 6d  sce(ecomment,com
18b80 6d 65 6e 74 29 22 0a 20 20 20 20 20 20 20 20 20  ment)".         
18b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
18ba0 20 20 46 52 4f 4d 20 65 76 65 6e 74 20 57 48 45    FROM event WHE
18bb0 52 45 20 6f 62 6a 69 64 3d 25 64 22 2c 20 72 69  RE objid=%d", ri
18bc0 64 29 3b 0a 20 20 7a 55 73 65 72 20 3d 20 64 62  d);.  zUser = db
18bd0 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54  _text(0, "SELECT
18be0 20 63 6f 61 6c 65 73 63 65 28 65 75 73 65 72 2c   coalesce(euser,
18bf0 75 73 65 72 29 22 0a 20 20 20 20 20 20 20 20 20  user)".         
18c00 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 46              "  F
18c10 52 4f 4d 20 65 76 65 6e 74 20 57 48 45 52 45 20  ROM event WHERE 
18c20 6f 62 6a 69 64 3d 25 64 22 2c 20 72 69 64 29 3b  objid=%d", rid);
18c30 0a 20 20 7a 44 61 74 65 20 3d 20 64 62 5f 74 65  .  zDate = db_te
18c40 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 64 61  xt(0, "SELECT da
18c50 74 65 74 69 6d 65 28 6d 74 69 6d 65 29 22 0a 20  tetime(mtime)". 
18c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c70 20 20 20 20 22 20 20 46 52 4f 4d 20 65 76 65 6e      "  FROM even
18c80 74 20 57 48 45 52 45 20 6f 62 6a 69 64 3d 25 64  t WHERE objid=%d
18c90 22 2c 20 72 69 64 29 3b 0a 20 20 7a 43 6f 6c 6f  ", rid);.  zColo
18ca0 72 20 3d 20 64 62 5f 74 65 78 74 28 22 22 2c 20  r = db_text("", 
18cb0 22 53 45 4c 45 43 54 20 62 67 63 6f 6c 6f 72 22  "SELECT bgcolor"
18cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18cd0 20 20 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d           "  FROM
18ce0 20 65 76 65 6e 74 20 57 48 45 52 45 20 6f 62 6a   event WHERE obj
18cf0 69 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20  id=%d", rid);.  
18d00 66 50 72 6f 70 61 67 61 74 65 43 6f 6c 6f 72 20  fPropagateColor 
18d10 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22 53 45 4c  = db_int(0, "SEL
18d20 45 43 54 20 74 61 67 74 79 70 65 20 46 52 4f 4d  ECT tagtype FROM
18d30 20 74 61 67 78 72 65 66 22 0a 20 20 20 20 20 20   tagxref".      
18d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d50 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
18d60 72 69 64 3d 25 64 20 41 4e 44 20 74 61 67 69 64  rid=%d AND tagid
18d70 3d 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%d",.          
18d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d90 20 20 20 20 72 69 64 2c 20 54 41 47 5f 42 47 43      rid, TAG_BGC
18da0 4f 4c 4f 52 29 3d 3d 32 3b 0a 20 20 66 4e 65 77  OLOR)==2;.  fNew
18db0 50 72 6f 70 61 67 61 74 65 43 6f 6c 6f 72 20 3d  PropagateColor =
18dc0 20 7a 4e 65 77 43 6f 6c 6f 72 20 26 26 20 7a 4e   zNewColor && zN
18dd0 65 77 43 6f 6c 6f 72 5b 30 5d 0a 20 20 20 20 20  ewColor[0].     
18de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18df0 20 20 20 3f 20 66 4e 65 77 50 72 6f 70 61 67 61     ? fNewPropaga
18e00 74 65 43 6f 6c 6f 72 20 3a 20 66 50 72 6f 70 61  teColor : fPropa
18e10 67 61 74 65 43 6f 6c 6f 72 3b 0a 20 20 64 62 5f  gateColor;.  db_
18e20 70 72 65 70 61 72 65 28 26 71 2c 0a 20 20 20 20  prepare(&q,.    
18e30 20 22 53 45 4c 45 43 54 20 74 61 67 2e 74 61 67   "SELECT tag.tag
18e40 69 64 20 46 52 4f 4d 20 74 61 67 78 72 65 66 2c  id FROM tagxref,
18e50 20 74 61 67 22 0a 20 20 20 20 20 22 20 57 48 45   tag".     " WHE
18e60 52 45 20 74 61 67 78 72 65 66 2e 72 69 64 3d 25  RE tagxref.rid=%
18e70 64 20 41 4e 44 20 74 61 67 74 79 70 65 3e 30 20  d AND tagtype>0 
18e80 41 4e 44 20 74 61 67 78 72 65 66 2e 74 61 67 69  AND tagxref.tagi
18e90 64 3d 74 61 67 2e 74 61 67 69 64 22 2c 0a 20 20  d=tag.tagid",.  
18ea0 20 20 20 72 69 64 0a 20 20 29 3b 0a 20 20 77 68     rid.  );.  wh
18eb0 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71 29  ile( db_step(&q)
18ec0 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
18ed0 20 20 20 20 69 6e 74 20 74 61 67 69 64 20 3d 20      int tagid = 
18ee0 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71  db_column_int(&q
18ef0 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66 28 20 74  , 0);..    if( t
18f00 61 67 69 64 20 3d 3d 20 54 41 47 5f 43 4c 4f 53  agid == TAG_CLOS
18f10 45 44 20 29 7b 0a 20 20 20 20 20 20 66 48 61 73  ED ){.      fHas
18f20 43 6c 6f 73 65 64 20 3d 20 31 3b 0a 20 20 20 20  Closed = 1;.    
18f30 7d 65 6c 73 65 20 69 66 28 20 74 61 67 69 64 3d  }else if( tagid=
18f40 3d 54 41 47 5f 48 49 44 44 45 4e 20 29 7b 0a 20  =TAG_HIDDEN ){. 
18f50 20 20 20 20 20 66 48 61 73 48 69 64 64 65 6e 20       fHasHidden 
18f60 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
18f70 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
18f80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 5f 66      }.  }.  db_f
18f90 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 62  inalize(&q);.  b
18fa0 6c 6f 62 5f 7a 65 72 6f 28 26 63 74 72 6c 29 3b  lob_zero(&ctrl);
18fb0 0a 20 20 7a 4e 6f 77 20 3d 20 64 61 74 65 5f 69  .  zNow = date_i
18fc0 6e 5f 73 74 61 6e 64 61 72 64 5f 66 6f 72 6d 61  n_standard_forma
18fd0 74 28 7a 43 68 6e 67 54 69 6d 65 20 26 26 20 7a  t(zChngTime && z
18fe0 43 68 6e 67 54 69 6d 65 5b 30 5d 20 3f 20 7a 43  ChngTime[0] ? zC
18ff0 68 6e 67 54 69 6d 65 20 3a 20 22 6e 6f 77 22 29  hngTime : "now")
19000 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66  ;.  blob_appendf
19010 28 26 63 74 72 6c 2c 20 22 44 20 25 73 5c 6e 22  (&ctrl, "D %s\n"
19020 2c 20 7a 4e 6f 77 29 3b 0a 20 20 69 6e 69 74 5f  , zNow);.  init_
19030 6e 65 77 74 61 67 73 28 29 3b 0a 20 20 69 66 28  newtags();.  if(
19040 20 7a 4e 65 77 43 6f 6c 6f 72 20 26 26 20 7a 4e   zNewColor && zN
19050 65 77 43 6f 6c 6f 72 5b 30 5d 0a 20 20 20 20 20  ewColor[0].     
19060 20 26 26 20 28 66 50 72 6f 70 61 67 61 74 65 43   && (fPropagateC
19070 6f 6c 6f 72 21 3d 66 4e 65 77 50 72 6f 70 61 67  olor!=fNewPropag
19080 61 74 65 43 6f 6c 6f 72 0a 20 20 20 20 20 20 20  ateColor.       
19090 20 20 20 20 20 7c 7c 20 66 6f 73 73 69 6c 5f 73       || fossil_s
190a0 74 72 63 6d 70 28 7a 43 6f 6c 6f 72 2c 7a 4e 65  trcmp(zColor,zNe
190b0 77 43 6f 6c 6f 72 29 21 3d 30 29 0a 20 20 29 7b  wColor)!=0).  ){
190c0 0a 20 20 20 20 61 64 64 5f 63 6f 6c 6f 72 28 0a  .    add_color(.
190d0 20 20 20 20 20 20 6d 70 72 69 6e 74 66 28 22 25        mprintf("%
190e0 73 25 73 22 2c 20 28 7a 4e 65 77 43 6f 6c 6f 72  s%s", (zNewColor
190f0 5b 30 5d 21 3d 27 23 27 20 26 26 0a 20 20 20 20  [0]!='#' &&.    
19100 20 20 20 20 76 61 6c 69 64 61 74 65 31 36 28 7a      validate16(z
19110 4e 65 77 43 6f 6c 6f 72 2c 73 74 72 6c 65 6e 28  NewColor,strlen(
19120 7a 4e 65 77 43 6f 6c 6f 72 29 29 20 26 26 0a 20  zNewColor)) &&. 
19130 20 20 20 20 20 20 20 28 73 74 72 6c 65 6e 28 7a         (strlen(z
19140 4e 65 77 43 6f 6c 6f 72 29 3d 3d 36 20 7c 7c 20  NewColor)==6 || 
19150 73 74 72 6c 65 6e 28 7a 4e 65 77 43 6f 6c 6f 72  strlen(zNewColor
19160 29 3d 3d 33 29 29 20 3f 20 22 23 22 20 3a 20 22  )==3)) ? "#" : "
19170 22 2c 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 43  ",.        zNewC
19180 6f 6c 6f 72 0a 20 20 20 20 20 20 29 2c 0a 20 20  olor.      ),.  
19190 20 20 20 20 66 4e 65 77 50 72 6f 70 61 67 61 74      fNewPropagat
191a0 65 43 6f 6c 6f 72 0a 20 20 20 20 29 3b 0a 20 20  eColor.    );.  
191b0 7d 0a 20 20 69 66 28 20 28 7a 4e 65 77 43 6f 6c  }.  if( (zNewCol
191c0 6f 72 21 3d 30 20 26 26 20 7a 4e 65 77 43 6f 6c  or!=0 && zNewCol
191d0 6f 72 5b 30 5d 3d 3d 30 29 20 26 26 20 28 7a 43  or[0]==0) && (zC
191e0 6f 6c 6f 72 20 26 26 20 7a 43 6f 6c 6f 72 5b 30  olor && zColor[0
191f0 5d 20 29 20 29 7b 0a 20 20 20 20 63 61 6e 63 65  ] ) ){.    cance
19200 6c 5f 63 6f 6c 6f 72 28 29 3b 0a 20 20 7d 0a 20  l_color();.  }. 
19210 20 69 66 28 20 66 45 64 69 74 43 6f 6d 6d 65 6e   if( fEditCommen
19220 74 20 29 7b 0a 20 20 20 20 70 72 65 70 61 72 65  t ){.    prepare
19230 5f 61 6d 65 6e 64 5f 63 6f 6d 6d 65 6e 74 28 26  _amend_comment(&
19240 63 6f 6d 6d 65 6e 74 2c 20 7a 43 6f 6d 6d 65 6e  comment, zCommen
19250 74 2c 20 7a 55 75 69 64 29 3b 0a 20 20 20 20 7a  t, zUuid);.    z
19260 4e 65 77 43 6f 6d 6d 65 6e 74 20 3d 20 62 6c 6f  NewComment = blo
19270 62 5f 73 74 72 28 26 63 6f 6d 6d 65 6e 74 29 3b  b_str(&comment);
19280 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 43 6f  .  }else if( zCo
19290 6d 46 69 6c 65 20 29 7b 0a 20 20 20 20 62 6c 6f  mFile ){.    blo
192a0 62 5f 7a 65 72 6f 28 26 63 6f 6d 6d 65 6e 74 29  b_zero(&comment)
192b0 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 61 64 5f  ;.    blob_read_
192c0 66 72 6f 6d 5f 66 69 6c 65 28 26 63 6f 6d 6d 65  from_file(&comme
192d0 6e 74 2c 20 7a 43 6f 6d 46 69 6c 65 2c 20 45 78  nt, zComFile, Ex
192e0 74 46 49 4c 45 29 3b 0a 20 20 20 20 62 6c 6f 62  tFILE);.    blob
192f0 5f 74 6f 5f 75 74 66 38 5f 6e 6f 5f 62 6f 6d 28  _to_utf8_no_bom(
19300 26 63 6f 6d 6d 65 6e 74 2c 20 31 29 3b 0a 20 20  &comment, 1);.  
19310 20 20 7a 4e 65 77 43 6f 6d 6d 65 6e 74 20 3d 20    zNewComment = 
19320 62 6c 6f 62 5f 73 74 72 28 26 63 6f 6d 6d 65 6e  blob_str(&commen
19330 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e  t);.  }.  if( zN
19340 65 77 43 6f 6d 6d 65 6e 74 20 26 26 20 7a 4e 65  ewComment && zNe
19350 77 43 6f 6d 6d 65 6e 74 5b 30 5d 0a 20 20 20 20  wComment[0].    
19360 20 20 26 26 20 63 6f 6d 6d 65 6e 74 5f 63 6f 6d    && comment_com
19370 70 61 72 65 28 7a 43 6f 6d 6d 65 6e 74 2c 7a 4e  pare(zComment,zN
19380 65 77 43 6f 6d 6d 65 6e 74 29 3d 3d 30 20 29 20  ewComment)==0 ) 
19390 61 64 64 5f 63 6f 6d 6d 65 6e 74 28 7a 4e 65 77  add_comment(zNew
193a0 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 69 66 28 20  Comment);.  if( 
193b0 7a 4e 65 77 44 61 74 65 20 26 26 20 7a 4e 65 77  zNewDate && zNew
193c0 44 61 74 65 5b 30 5d 20 26 26 20 66 6f 73 73 69  Date[0] && fossi
193d0 6c 5f 73 74 72 63 6d 70 28 7a 44 61 74 65 2c 7a  l_strcmp(zDate,z
193e0 4e 65 77 44 61 74 65 29 21 3d 30 20 29 7b 0a 20  NewDate)!=0 ){. 
193f0 20 20 20 69 66 28 20 69 73 5f 64 61 74 65 74 69     if( is_dateti
19400 6d 65 28 7a 4e 65 77 44 61 74 65 29 20 29 7b 0a  me(zNewDate) ){.
19410 20 20 20 20 20 20 61 64 64 5f 64 61 74 65 28 7a        add_date(z
19420 4e 65 77 44 61 74 65 29 3b 0a 20 20 20 20 7d 65  NewDate);.    }e
19430 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 73 73 69  lse{.      fossi
19440 6c 5f 66 61 74 61 6c 28 22 55 6e 73 75 70 70 6f  l_fatal("Unsuppo
19450 72 74 65 64 20 64 61 74 65 20 66 6f 72 6d 61 74  rted date format
19460 2c 20 75 73 65 20 59 59 59 59 2d 4d 4d 2d 44 44  , use YYYY-MM-DD
19470 20 48 48 3a 4d 4d 3a 53 53 22 29 3b 0a 20 20 20   HH:MM:SS");.   
19480 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 65   }.  }.  if( zNe
19490 77 55 73 65 72 20 26 26 20 7a 4e 65 77 55 73 65  wUser && zNewUse
194a0 72 5b 30 5d 20 26 26 20 66 6f 73 73 69 6c 5f 73  r[0] && fossil_s
194b0 74 72 63 6d 70 28 7a 55 73 65 72 2c 7a 4e 65 77  trcmp(zUser,zNew
194c0 55 73 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20  User)!=0 ){.    
194d0 61 64 64 5f 75 73 65 72 28 7a 4e 65 77 55 73 65  add_user(zNewUse
194e0 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 7a  r);.  }.  if( pz
194f0 4e 65 77 54 61 67 73 21 3d 30 20 29 7b 0a 20 20  NewTags!=0 ){.  
19500 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 61    for(i=0; i<nTa
19510 67 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gs; i++){.      
19520 69 66 28 20 70 7a 4e 65 77 54 61 67 73 5b 69 5d  if( pzNewTags[i]
19530 20 26 26 20 70 7a 4e 65 77 54 61 67 73 5b 69 5d   && pzNewTags[i]
19540 5b 30 5d 20 29 20 61 64 64 5f 74 61 67 28 70 7a  [0] ) add_tag(pz
19550 4e 65 77 54 61 67 73 5b 69 5d 29 3b 0a 20 20 20  NewTags[i]);.   
19560 20 7d 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 72   }.    fossil_fr
19570 65 65 28 28 76 6f 69 64 20 2a 29 70 7a 4e 65 77  ee((void *)pzNew
19580 54 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Tags);.  }.  if(
19590 20 70 7a 43 61 6e 63 65 6c 54 61 67 73 21 3d 30   pzCancelTags!=0
195a0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
195b0 20 69 3c 6e 43 61 6e 63 65 6c 73 3b 20 69 2b 2b   i<nCancels; i++
195c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 7a 43  ){.      if( pzC
195d0 61 6e 63 65 6c 54 61 67 73 5b 69 5d 20 26 26 20  ancelTags[i] && 
195e0 70 7a 43 61 6e 63 65 6c 54 61 67 73 5b 69 5d 5b  pzCancelTags[i][
195f0 30 5d 20 29 0a 20 20 20 20 20 20 20 20 63 61 6e  0] ).        can
19600 63 65 6c 5f 74 61 67 28 72 69 64 2c 70 7a 43 61  cel_tag(rid,pzCa
19610 6e 63 65 6c 54 61 67 73 5b 69 5d 29 3b 0a 20 20  ncelTags[i]);.  
19620 20 20 7d 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66    }.    fossil_f
19630 72 65 65 28 28 76 6f 69 64 20 2a 29 70 7a 43 61  ree((void *)pzCa
19640 6e 63 65 6c 54 61 67 73 29 3b 0a 20 20 7d 0a 20  ncelTags);.  }. 
19650 20 69 66 28 20 66 48 69 64 65 20 26 26 20 21 66   if( fHide && !f
19660 48 61 73 48 69 64 64 65 6e 20 29 20 68 69 64 65  HasHidden ) hide
19670 5f 62 72 61 6e 63 68 28 29 3b 0a 20 20 69 66 28  _branch();.  if(
19680 20 66 43 6c 6f 73 65 20 26 26 20 21 66 48 61 73   fClose && !fHas
19690 43 6c 6f 73 65 64 20 29 20 63 6c 6f 73 65 5f 6c  Closed ) close_l
196a0 65 61 66 28 72 69 64 29 3b 0a 20 20 69 66 28 20  eaf(rid);.  if( 
196b0 7a 4e 65 77 42 72 61 6e 63 68 20 26 26 20 7a 4e  zNewBranch && zN
196c0 65 77 42 72 61 6e 63 68 5b 30 5d 20 29 20 63 68  ewBranch[0] ) ch
196d0 61 6e 67 65 5f 62 72 61 6e 63 68 28 72 69 64 2c  ange_branch(rid,
196e0 7a 4e 65 77 42 72 61 6e 63 68 29 3b 0a 20 20 61  zNewBranch);.  a
196f0 70 70 6c 79 5f 6e 65 77 74 61 67 73 28 26 63 74  pply_newtags(&ct
19700 72 6c 2c 20 72 69 64 2c 20 7a 55 75 69 64 2c 20  rl, rid, zUuid, 
19710 7a 55 73 65 72 4f 76 72 64 2c 20 66 44 72 79 52  zUserOvrd, fDryR
19720 75 6e 29 3b 0a 20 20 69 66 28 20 66 44 72 79 52  un);.  if( fDryR
19730 75 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 73 68 6f  un==0 ){.    sho
19740 77 5f 63 6f 6d 6d 6f 6e 5f 69 6e 66 6f 28 72 69  w_common_info(ri
19750 64 2c 20 22 75 75 69 64 3a 22 2c 20 31 2c 20 30  d, "uuid:", 1, 0
19760 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 2e 6c  );.  }.  if( g.l
19770 6f 63 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  ocalOpen ){.    
19780 6d 61 6e 69 66 65 73 74 5f 74 6f 5f 64 69 73 6b  manifest_to_disk
19790 28 72 69 64 29 3b 0a 20 20 7d 0a 7d 0a           (rid);.  }.}.