dbda8d6ce9 2007-07-21 drh: /* dbda8d6ce9 2007-07-21 drh: ** Copyright (c) 2007 D. Richard Hipp dbda8d6ce9 2007-07-21 drh: ** dbda8d6ce9 2007-07-21 drh: ** This program is free software; you can redistribute it and/or dbda8d6ce9 2007-07-21 drh: ** modify it under the terms of the GNU General Public dbda8d6ce9 2007-07-21 drh: ** License version 2 as published by the Free Software Foundation. dbda8d6ce9 2007-07-21 drh: ** dbda8d6ce9 2007-07-21 drh: ** This program is distributed in the hope that it will be useful, dbda8d6ce9 2007-07-21 drh: ** but WITHOUT ANY WARRANTY; without even the implied warranty of dbda8d6ce9 2007-07-21 drh: ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU dbda8d6ce9 2007-07-21 drh: ** General Public License for more details. dbda8d6ce9 2007-07-21 drh: ** dbda8d6ce9 2007-07-21 drh: ** You should have received a copy of the GNU General Public dbda8d6ce9 2007-07-21 drh: ** License along with this library; if not, write to the dbda8d6ce9 2007-07-21 drh: ** Free Software Foundation, Inc., 59 Temple Place - Suite 330, dbda8d6ce9 2007-07-21 drh: ** Boston, MA 02111-1307, USA. dbda8d6ce9 2007-07-21 drh: ** dbda8d6ce9 2007-07-21 drh: ** Author contact information: dbda8d6ce9 2007-07-21 drh: ** drh@hwaci.com dbda8d6ce9 2007-07-21 drh: ** http://www.hwaci.com/drh/ dbda8d6ce9 2007-07-21 drh: ** dbda8d6ce9 2007-07-21 drh: ******************************************************************************* dbda8d6ce9 2007-07-21 drh: ** dbda8d6ce9 2007-07-21 drh: ** This file contains code to implement the "info" command. The dbda8d6ce9 2007-07-21 drh: ** "info" command gives command-line access to information about b5f4f910b7 2009-08-29 drh: ** the current tree, or a particular artifact or check-in. dbda8d6ce9 2007-07-21 drh: */ dbda8d6ce9 2007-07-21 drh: #include "config.h" dbda8d6ce9 2007-07-21 drh: #include "info.h" dbda8d6ce9 2007-07-21 drh: #include <assert.h> dbda8d6ce9 2007-07-21 drh: dbda8d6ce9 2007-07-21 drh: dbda8d6ce9 2007-07-21 drh: /* dbda8d6ce9 2007-07-21 drh: ** Print common information about a particular record. dbda8d6ce9 2007-07-21 drh: ** dbda8d6ce9 2007-07-21 drh: ** * The UUID dbda8d6ce9 2007-07-21 drh: ** * The record ID dbda8d6ce9 2007-07-21 drh: ** * mtime and ctime dbda8d6ce9 2007-07-21 drh: ** * who signed it dbda8d6ce9 2007-07-21 drh: */ dbda8d6ce9 2007-07-21 drh: void show_common_info(int rid, const char *zUuidName, int showComment){ dbda8d6ce9 2007-07-21 drh: Stmt q; dbda8d6ce9 2007-07-21 drh: char *zComment = 0; 2521a0a9a7 2009-01-21 drh: char *zTags; 76630dd9f3 2009-08-28 drh: char *zDate; 76630dd9f3 2009-08-28 drh: char *zUuid; 76630dd9f3 2009-08-28 drh: zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid); 76630dd9f3 2009-08-28 drh: if( zUuid ){ 76630dd9f3 2009-08-28 drh: zDate = db_text("", 76630dd9f3 2009-08-28 drh: "SELECT datetime(mtime) || ' UTC' FROM event WHERE objid=%d", 76630dd9f3 2009-08-28 drh: rid 76630dd9f3 2009-08-28 drh: ); dbda8d6ce9 2007-07-21 drh: /* 01234567890123 */ 76630dd9f3 2009-08-28 drh: printf("%-13s %s %s\n", zUuidName, zUuid, zDate); 76630dd9f3 2009-08-28 drh: free(zUuid); 76630dd9f3 2009-08-28 drh: free(zDate); 76630dd9f3 2009-08-28 drh: } 76630dd9f3 2009-08-28 drh: db_prepare(&q, "SELECT uuid, pid FROM plink JOIN blob ON pid=rid " dbda8d6ce9 2007-07-21 drh: " WHERE cid=%d", rid); dbda8d6ce9 2007-07-21 drh: while( db_step(&q)==SQLITE_ROW ){ dbda8d6ce9 2007-07-21 drh: const char *zUuid = db_column_text(&q, 0); 76630dd9f3 2009-08-28 drh: zDate = db_text("", 76630dd9f3 2009-08-28 drh: "SELECT datetime(mtime) || ' UTC' FROM event WHERE objid=%d", 76630dd9f3 2009-08-28 drh: db_column_int(&q, 1) 76630dd9f3 2009-08-28 drh: ); 76630dd9f3 2009-08-28 drh: printf("parent: %s %s\n", zUuid, zDate); 76630dd9f3 2009-08-28 drh: free(zDate); 76630dd9f3 2009-08-28 drh: } 76630dd9f3 2009-08-28 drh: db_finalize(&q); 76630dd9f3 2009-08-28 drh: db_prepare(&q, "SELECT uuid, cid FROM plink JOIN blob ON cid=rid " dbda8d6ce9 2007-07-21 drh: " WHERE pid=%d", rid); dbda8d6ce9 2007-07-21 drh: while( db_step(&q)==SQLITE_ROW ){ dbda8d6ce9 2007-07-21 drh: const char *zUuid = db_column_text(&q, 0); 76630dd9f3 2009-08-28 drh: zDate = db_text("", 76630dd9f3 2009-08-28 drh: "SELECT datetime(mtime) || ' UTC' FROM event WHERE objid=%d", 76630dd9f3 2009-08-28 drh: db_column_int(&q, 1) 76630dd9f3 2009-08-28 drh: ); 76630dd9f3 2009-08-28 drh: printf("child: %s %s\n", zUuid, zDate); 76630dd9f3 2009-08-28 drh: free(zDate); dbda8d6ce9 2007-07-21 drh: } dbda8d6ce9 2007-07-21 drh: db_finalize(&q); 2521a0a9a7 2009-01-21 drh: zTags = db_text(0, "SELECT group_concat(substr(tagname, 5), ', ')" 2521a0a9a7 2009-01-21 drh: " FROM tagxref, tag" 2521a0a9a7 2009-01-21 drh: " WHERE tagxref.rid=%d AND tagxref.tagtype>0" 2521a0a9a7 2009-01-21 drh: " AND tag.tagid=tagxref.tagid" 2521a0a9a7 2009-01-21 drh: " AND tag.tagname GLOB 'sym-*'", 2521a0a9a7 2009-01-21 drh: rid); 2521a0a9a7 2009-01-21 drh: if( zTags && zTags[0] ){ 2521a0a9a7 2009-01-21 drh: printf("tags: %s\n", zTags); 2521a0a9a7 2009-01-21 drh: } 2521a0a9a7 2009-01-21 drh: free(zTags); dbda8d6ce9 2007-07-21 drh: if( zComment ){ dbda8d6ce9 2007-07-21 drh: printf("comment:\n%s\n", zComment); dbda8d6ce9 2007-07-21 drh: free(zComment); dbda8d6ce9 2007-07-21 drh: } dbda8d6ce9 2007-07-21 drh: } dbda8d6ce9 2007-07-21 drh: dbda8d6ce9 2007-07-21 drh: dbda8d6ce9 2007-07-21 drh: /* dbda8d6ce9 2007-07-21 drh: ** COMMAND: info dbda8d6ce9 2007-07-21 drh: ** e8c4f69c50 2008-10-24 drh: ** Usage: %fossil info ?ARTIFACT-ID|FILENAME? 6607844a01 2007-08-18 drh: ** dbda8d6ce9 2007-07-21 drh: ** With no arguments, provide information about the current tree. e8c4f69c50 2008-10-24 drh: ** If an argument is specified, provide information about the object 974f025c6e 2008-10-17 drh: ** in the respository of the current tree that the argument refers 974f025c6e 2008-10-17 drh: ** to. Or if the argument is the name of a repository, show 974f025c6e 2008-10-17 drh: ** information about that repository. dbda8d6ce9 2007-07-21 drh: */ dbda8d6ce9 2007-07-21 drh: void info_cmd(void){ 974f025c6e 2008-10-17 drh: i64 fsize; dbda8d6ce9 2007-07-21 drh: if( g.argc!=2 && g.argc!=3 ){ e8c4f69c50 2008-10-24 drh: usage("?FILENAME|ARTIFACT-ID?"); 974f025c6e 2008-10-17 drh: } 974f025c6e 2008-10-17 drh: if( g.argc==3 && (fsize = file_size(g.argv[2]))>0 && (fsize&0x1ff)==0 ){ 00ac7945a9 2009-08-13 drh: db_open_config(0); 974f025c6e 2008-10-17 drh: db_record_repository_filename(g.argv[2]); 974f025c6e 2008-10-17 drh: db_open_repository(g.argv[2]); 974f025c6e 2008-10-17 drh: printf("project-code: %s\n", db_get("project-code", "<none>")); 974f025c6e 2008-10-17 drh: printf("project-name: %s\n", db_get("project-name", "<unnamed>")); 974f025c6e 2008-10-17 drh: printf("server-code: %s\n", db_get("server-code", "<none>")); 974f025c6e 2008-10-17 drh: return; dbda8d6ce9 2007-07-21 drh: } dbda8d6ce9 2007-07-21 drh: db_must_be_within_tree(); dbda8d6ce9 2007-07-21 drh: if( g.argc==2 ){ dbda8d6ce9 2007-07-21 drh: int vid; dbda8d6ce9 2007-07-21 drh: /* 012345678901234 */ 2bd0690fe8 2008-10-17 drh: db_record_repository_filename(0); dbda8d6ce9 2007-07-21 drh: printf("repository: %s\n", db_lget("repository", "")); dbda8d6ce9 2007-07-21 drh: printf("local-root: %s\n", g.zLocalRoot); dbda8d6ce9 2007-07-21 drh: printf("project-code: %s\n", db_get("project-code", "")); dbda8d6ce9 2007-07-21 drh: printf("server-code: %s\n", db_get("server-code", "")); dbda8d6ce9 2007-07-21 drh: vid = db_lget_int("checkout", 0); dbda8d6ce9 2007-07-21 drh: if( vid==0 ){ dbda8d6ce9 2007-07-21 drh: printf("checkout: nil\n"); dbda8d6ce9 2007-07-21 drh: }else{ dbda8d6ce9 2007-07-21 drh: show_common_info(vid, "checkout:", 1); dbda8d6ce9 2007-07-21 drh: } dbda8d6ce9 2007-07-21 drh: }else{ 68c24b1857 2008-05-16 drh: int rid; 68c24b1857 2008-05-16 drh: rid = name_to_rid(g.argv[2]); dbda8d6ce9 2007-07-21 drh: if( rid==0 ){ dbda8d6ce9 2007-07-21 drh: fossil_panic("no such object: %s\n", g.argv[2]); dbda8d6ce9 2007-07-21 drh: } dbda8d6ce9 2007-07-21 drh: show_common_info(rid, "uuid:", 1); dbda8d6ce9 2007-07-21 drh: } dbda8d6ce9 2007-07-21 drh: } dbda8d6ce9 2007-07-21 drh: 30d7afe328 2007-08-01 drh: /* 042a08b564 2009-01-22 drh: ** Show information about all tags on a given node. 042a08b564 2009-01-22 drh: */ 042a08b564 2009-01-22 drh: static void showTags(int rid, const char *zNotGlob){ 30d7afe328 2007-08-01 drh: Stmt q; 30d7afe328 2007-08-01 drh: int cnt = 0; 30d7afe328 2007-08-01 drh: db_prepare(&q, 042a08b564 2009-01-22 drh: "SELECT tag.tagid, tagname, " 042a08b564 2009-01-22 drh: " (SELECT uuid FROM blob WHERE rid=tagxref.srcid AND rid!=%d)," 042a08b564 2009-01-22 drh: " value, datetime(tagxref.mtime,'localtime'), tagtype," 042a08b564 2009-01-22 drh: " (SELECT uuid FROM blob WHERE rid=tagxref.origid AND rid!=%d)" 042a08b564 2009-01-22 drh: " FROM tagxref JOIN tag ON tagxref.tagid=tag.tagid" 042a08b564 2009-01-22 drh: " WHERE tagxref.rid=%d AND tagname NOT GLOB '%s'" 042a08b564 2009-01-22 drh: " ORDER BY tagname", rid, rid, rid, zNotGlob 30d7afe328 2007-08-01 drh: ); 30d7afe328 2007-08-01 drh: while( db_step(&q)==SQLITE_ROW ){ 042a08b564 2009-01-22 drh: const char *zTagname = db_column_text(&q, 1); 042a08b564 2009-01-22 drh: const char *zSrcUuid = db_column_text(&q, 2); 042a08b564 2009-01-22 drh: const char *zValue = db_column_text(&q, 3); 042a08b564 2009-01-22 drh: const char *zDate = db_column_text(&q, 4); 042a08b564 2009-01-22 drh: int tagtype = db_column_int(&q, 5); 042a08b564 2009-01-22 drh: const char *zOrigUuid = db_column_text(&q, 6); 30d7afe328 2007-08-01 drh: cnt++; 30d7afe328 2007-08-01 drh: if( cnt==1 ){ 042a08b564 2009-01-22 drh: @ <div class="section">Tags And Properties</div> 30d7afe328 2007-08-01 drh: @ <ul> 30d7afe328 2007-08-01 drh: } 30d7afe328 2007-08-01 drh: @ <li> 042a08b564 2009-01-22 drh: if( tagtype==0 ){ eb8223e164 2009-01-25 drh: @ <b><s>%h(zTagname)</s></b> cancelled 042a08b564 2009-01-22 drh: }else if( zValue ){ eb8223e164 2009-01-25 drh: @ <b>%h(zTagname)=%h(zValue)</b> 042a08b564 2009-01-22 drh: }else { eb8223e164 2009-01-25 drh: @ <b>%h(zTagname)</b> 042a08b564 2009-01-22 drh: } 042a08b564 2009-01-22 drh: if( tagtype==2 ){ 042a08b564 2009-01-22 drh: if( zOrigUuid && zOrigUuid[0] ){ 042a08b564 2009-01-22 drh: @ inherited from 042a08b564 2009-01-22 drh: hyperlink_to_uuid(zOrigUuid); 042a08b564 2009-01-22 drh: }else{ 042a08b564 2009-01-22 drh: @ propagates to descendants 042a08b564 2009-01-22 drh: } 042a08b564 2009-01-22 drh: } 042a08b564 2009-01-22 drh: if( zSrcUuid && zSrcUuid[0] ){ 042a08b564 2009-01-22 drh: if( tagtype==0 ){ 042a08b564 2009-01-22 drh: @ by 042a08b564 2009-01-22 drh: }else{ 042a08b564 2009-01-22 drh: @ added by 042a08b564 2009-01-22 drh: } 042a08b564 2009-01-22 drh: hyperlink_to_uuid(zSrcUuid); b5f4f910b7 2009-08-29 drh: @ on b5f4f910b7 2009-08-29 drh: hyperlink_to_date(zDate,0); 3b5514ed82 2007-09-22 drh: } 3b5514ed82 2007-09-22 drh: } 3b5514ed82 2007-09-22 drh: db_finalize(&q); 30d7afe328 2007-08-01 drh: if( cnt ){ 30d7afe328 2007-08-01 drh: @ </ul> 30d7afe328 2007-08-01 drh: } 4ac16995e8 2007-08-19 drh: } 4ac16995e8 2007-08-19 drh: 4ac16995e8 2007-08-19 drh: 4ac16995e8 2007-08-19 drh: /* 713b8be852 2009-08-28 drh: ** Append the difference between two RIDs to the output 713b8be852 2009-08-28 drh: */ 713b8be852 2009-08-28 drh: static void append_diff(int fromid, int toid){ 713b8be852 2009-08-28 drh: Blob from, to, out; 713b8be852 2009-08-28 drh: content_get(fromid, &from); 713b8be852 2009-08-28 drh: content_get(toid, &to); 713b8be852 2009-08-28 drh: blob_zero(&out); 713b8be852 2009-08-28 drh: text_diff(&from, &to, &out, 5); 713b8be852 2009-08-28 drh: @ %h(blob_str(&out)) 713b8be852 2009-08-28 drh: blob_reset(&from); 713b8be852 2009-08-28 drh: blob_reset(&to); 713b8be852 2009-08-28 drh: blob_reset(&out); 4ac16995e8 2007-08-19 drh: } 4ac16995e8 2007-08-19 drh: 30d7afe328 2007-08-01 drh: 3dcaed8d86 2007-07-28 dan: /* 3dcaed8d86 2007-07-28 dan: ** WEBPAGE: vinfo 9be1b00392 2009-01-25 drh: ** WEBPAGE: ci 9be1b00392 2009-01-25 drh: ** URL: /ci?name=RID|ARTIFACTID 9be1b00392 2009-01-25 drh: ** 713b8be852 2009-08-28 drh: ** Display information about a particular check-in. 9be1b00392 2009-01-25 drh: */ 9be1b00392 2009-01-25 drh: void ci_page(void){ 3dcaed8d86 2007-07-28 dan: Stmt q; 3dcaed8d86 2007-07-28 dan: int rid; 30d7afe328 2007-08-01 drh: int isLeaf; fd36718ad9 2007-07-31 drh: fd36718ad9 2007-07-31 drh: login_check_credentials(); 2b0d4519dc 2008-05-05 drh: if( !g.okRead ){ login_needed(); return; } 677aa71bca 2007-10-12 drh: rid = name_to_rid(PD("name","0")); 3dcaed8d86 2007-07-28 dan: if( rid==0 ){ bf7ca1a4d8 2009-01-20 drh: style_header("Check-in Information Error"); 3dcaed8d86 2007-07-28 dan: @ No such object: %h(g.argv[2]) 3dcaed8d86 2007-07-28 dan: style_footer(); 3dcaed8d86 2007-07-28 dan: return; 3dcaed8d86 2007-07-28 dan: } 30d7afe328 2007-08-01 drh: isLeaf = !db_exists("SELECT 1 FROM plink WHERE pid=%d", rid); 3dcaed8d86 2007-07-28 dan: db_prepare(&q, 86c8768475 2007-08-01 drh: "SELECT uuid, datetime(mtime, 'localtime'), user, comment" 30d7afe328 2007-08-01 drh: " FROM blob, event" 30d7afe328 2007-08-01 drh: " WHERE blob.rid=%d" 30d7afe328 2007-08-01 drh: " AND event.objid=%d", 30d7afe328 2007-08-01 drh: rid, rid 3dcaed8d86 2007-07-28 dan: ); 3dcaed8d86 2007-07-28 dan: if( db_step(&q)==SQLITE_ROW ){ 3dcaed8d86 2007-07-28 dan: const char *zUuid = db_column_text(&q, 0); bf7ca1a4d8 2009-01-20 drh: char *zTitle = mprintf("Check-in [%.10s]", zUuid); f0474b87b0 2008-07-19 drh: char *zEUser, *zEComment; f0474b87b0 2008-07-19 drh: const char *zUser; f0474b87b0 2008-07-19 drh: const char *zComment; b5f4f910b7 2009-08-29 drh: const char *zDate; cfc7984ede 2007-09-25 jnc: style_header(zTitle); 2b0d4519dc 2008-05-05 drh: login_anonymous_available(); cfc7984ede 2007-09-25 jnc: free(zTitle); f0474b87b0 2008-07-19 drh: zEUser = db_text(0, f0474b87b0 2008-07-19 drh: "SELECT value FROM tagxref WHERE tagid=%d AND rid=%d", f0474b87b0 2008-07-19 drh: TAG_USER, rid); f0474b87b0 2008-07-19 drh: zEComment = db_text(0, f0474b87b0 2008-07-19 drh: "SELECT value FROM tagxref WHERE tagid=%d AND rid=%d", f0474b87b0 2008-07-19 drh: TAG_COMMENT, rid); f0474b87b0 2008-07-19 drh: zUser = db_column_text(&q, 2); f0474b87b0 2008-07-19 drh: zComment = db_column_text(&q, 3); b5f4f910b7 2009-08-29 drh: zDate = db_column_text(&q,1); 34af72801d 2007-11-23 drh: @ <div class="section">Overview</div> cfc7984ede 2007-09-25 jnc: @ <p><table class="label-value"> 713b8be852 2009-08-28 drh: @ <tr><th>SHA1 Hash:</th><td>%s(zUuid) 4ac16995e8 2007-08-19 drh: if( g.okSetup ){ 713b8be852 2009-08-28 drh: @ (Record ID: %d(rid)) 713b8be852 2009-08-28 drh: } e38c89130f 2008-02-24 drh: @ </td></tr> b5f4f910b7 2009-08-29 drh: @ <tr><th>Date:</th><td> b5f4f910b7 2009-08-29 drh: hyperlink_to_date(zDate, "</td></tr>"); f0474b87b0 2008-07-19 drh: if( zEUser ){ b5f4f910b7 2009-08-29 drh: @ <tr><th>Edited User:</td><td> b5f4f910b7 2009-08-29 drh: hyperlink_to_user(zEUser,zDate,"</td></tr>"); b5f4f910b7 2009-08-29 drh: @ <tr><th>Original User:</th><td> b5f4f910b7 2009-08-29 drh: hyperlink_to_user(zUser,zDate,"</td></tr>"); b5f4f910b7 2009-08-29 drh: }else{ b5f4f910b7 2009-08-29 drh: @ <tr><th>User:</td><td> b5f4f910b7 2009-08-29 drh: hyperlink_to_user(zUser,zDate,"</td></tr>"); f0474b87b0 2008-07-19 drh: } f0474b87b0 2008-07-19 drh: if( zEComment ){ f0474b87b0 2008-07-19 drh: @ <tr><th>Edited Comment:</th><td>%w(zEComment)</td></tr> f0474b87b0 2008-07-19 drh: @ <tr><th>Original Comment:</th><td>%w(zComment)</td></tr> f0474b87b0 2008-07-19 drh: }else{ f0474b87b0 2008-07-19 drh: @ <tr><th>Comment:</th><td>%w(zComment)</td></tr> f0474b87b0 2008-07-19 drh: } 3afcc4388c 2007-11-22 drh: @ </td></tr> 766bec08ce 2009-01-25 drh: if( g.okAdmin ){ 766bec08ce 2009-01-25 drh: db_prepare(&q, 766bec08ce 2009-01-25 drh: "SELECT rcvfrom.ipaddr, user.login, datetime(rcvfrom.mtime)" 766bec08ce 2009-01-25 drh: " FROM blob JOIN rcvfrom USING(rcvid) LEFT JOIN user USING(uid)" 766bec08ce 2009-01-25 drh: " WHERE blob.rid=%d", 766bec08ce 2009-01-25 drh: rid 766bec08ce 2009-01-25 drh: ); 766bec08ce 2009-01-25 drh: if( db_step(&q)==SQLITE_ROW ){ 766bec08ce 2009-01-25 drh: const char *zIpAddr = db_column_text(&q, 0); 766bec08ce 2009-01-25 drh: const char *zUser = db_column_text(&q, 1); 766bec08ce 2009-01-25 drh: const char *zDate = db_column_text(&q, 2); 766bec08ce 2009-01-25 drh: if( zUser==0 || zUser[0]==0 ) zUser = "unknown"; 766bec08ce 2009-01-25 drh: @ <tr><th>Received From:</th> 766bec08ce 2009-01-25 drh: @ <td>%h(zUser) @ %h(zIpAddr) on %s(zDate)</td></tr> 766bec08ce 2009-01-25 drh: } 766bec08ce 2009-01-25 drh: db_finalize(&q); 766bec08ce 2009-01-25 drh: } 3c9e5699ce 2008-08-13 cle: if( g.okHistory ){ 3c9e5699ce 2008-08-13 cle: char *zShortUuid = mprintf("%.10s", zUuid); bdac9f7238 2008-08-14 hintze: const char *zProjName = db_get("project-name", "unnamed"); 2b0d4519dc 2008-05-05 drh: @ <tr><th>Timelines:</th><td> 2b0d4519dc 2008-05-05 drh: @ <a href="%s(g.zBaseURL)/timeline?p=%d(rid)">ancestors</a> 6458f020fc 2008-05-14 drh: @ | <a href="%s(g.zBaseURL)/timeline?d=%d(rid)">descendants</a> 2b0d4519dc 2008-05-05 drh: @ | <a href="%s(g.zBaseURL)/timeline?d=%d(rid)&p=%d(rid)">both</a> e631d8af6d 2009-01-21 drh: db_prepare(&q, "SELECT substr(tag.tagname,5) FROM tagxref, tag " fecb3e5cc9 2009-01-20 drh: " WHERE rid=%d AND tagtype>0 " fecb3e5cc9 2009-01-20 drh: " AND tag.tagid=tagxref.tagid " fecb3e5cc9 2009-01-20 drh: " AND +tag.tagname GLOB 'sym-*'", rid); fecb3e5cc9 2009-01-20 drh: while( db_step(&q)==SQLITE_ROW ){ e631d8af6d 2009-01-21 drh: const char *zTagName = db_column_text(&q, 0); e631d8af6d 2009-01-21 drh: @ | <a href="%s(g.zBaseURL)/timeline?t=%T(zTagName)">%h(zTagName)</a> fecb3e5cc9 2009-01-20 drh: } fecb3e5cc9 2009-01-20 drh: db_finalize(&q); 3dcaed8d86 2007-07-28 dan: @ </td></tr> 713b8be852 2009-08-28 drh: @ <tr><th>Other Links:</th> 2b0d4519dc 2008-05-05 drh: @ <td> 713b8be852 2009-08-28 drh: @ <a href="%s(g.zBaseURL)/dir?ci=%s(zShortUuid)">files</a> 81a96aadf3 2008-08-17 cle: @ | <a href="%s(g.zBaseURL)/zip/%s(zProjName)-%s(zShortUuid).zip?uuid=%s(zUuid)"> bdac9f7238 2008-08-14 hintze: @ ZIP archive</a> 2b0d4519dc 2008-05-05 drh: @ | <a href="%s(g.zBaseURL)/artifact/%d(rid)">manifest</a> f0474b87b0 2008-07-19 drh: if( g.okWrite ){ 9be1b00392 2009-01-25 drh: @ | <a href="%s(g.zBaseURL)/ci_edit?r=%d(rid)">edit</a> f0474b87b0 2008-07-19 drh: } 2b0d4519dc 2008-05-05 drh: @ </td> 2b0d4519dc 2008-05-05 drh: @ </tr> 3c9e5699ce 2008-08-13 cle: free(zShortUuid); 2b0d4519dc 2008-05-05 drh: } cfc7984ede 2007-09-25 jnc: @ </table></p> cfc7984ede 2007-09-25 jnc: }else{ e8d3e327f1 2009-01-22 drh: style_header("Check-in Information"); 2b0d4519dc 2008-05-05 drh: login_anonymous_available(); 30d7afe328 2007-08-01 drh: } 30d7afe328 2007-08-01 drh: db_finalize(&q); 3122fc4c7e 2008-02-14 drh: showTags(rid, ""); 3122fc4c7e 2008-02-14 drh: @ <div class="section">Changes</div> 30d7afe328 2007-08-01 drh: db_prepare(&q, 713b8be852 2009-08-28 drh: "SELECT pid, fid, name, substr(a.uuid,1,10), substr(b.uuid,1,10)" 713b8be852 2009-08-28 drh: " FROM mlink JOIN filename ON filename.fnid=mlink.fnid" 713b8be852 2009-08-28 drh: " LEFT JOIN blob a ON a.rid=pid" 713b8be852 2009-08-28 drh: " LEFT JOIN blob b ON b.rid=fid" 713b8be852 2009-08-28 drh: " WHERE mlink.mid=%d" 713b8be852 2009-08-28 drh: " ORDER BY name", 30d7afe328 2007-08-01 drh: rid 30d7afe328 2007-08-01 drh: ); 30d7afe328 2007-08-01 drh: while( db_step(&q)==SQLITE_ROW ){ 713b8be852 2009-08-28 drh: int pid = db_column_int(&q,0); 713b8be852 2009-08-28 drh: int fid = db_column_int(&q,1); 713b8be852 2009-08-28 drh: const char *zName = db_column_text(&q,2); 713b8be852 2009-08-28 drh: const char *zOld = db_column_text(&q,3); 713b8be852 2009-08-28 drh: const char *zNew = db_column_text(&q,4); 5fe3aee839 2009-08-30 drh: if( !g.okHistory ){ 5fe3aee839 2009-08-30 drh: if( zNew==0 ){ 5fe3aee839 2009-08-30 drh: @ <p>Deleted %h(zName)</p> 5fe3aee839 2009-08-30 drh: continue; 5fe3aee839 2009-08-30 drh: }else{ 5fe3aee839 2009-08-30 drh: @ <p>Changes to %h(zName)</p> 5fe3aee839 2009-08-30 drh: } 5fe3aee839 2009-08-30 drh: }else if( zOld && zNew ){ 713b8be852 2009-08-28 drh: @ <p>Modified <a href="%s(g.zBaseURL)/finfo?name=%T(zName)">%h(zName)</a> 713b8be852 2009-08-28 drh: @ from <a href="%s(g.zBaseURL)/artifact/%s(zOld)">[%s(zOld)]</a> 713b8be852 2009-08-28 drh: @ to <a href="%s(g.zBaseURL)/artifact/%s(zNew)">[%s(zNew)]</a></p> 713b8be852 2009-08-28 drh: }else if( zOld ){ 713b8be852 2009-08-28 drh: @ <p>Deleted <a href="%s(g.zBaseURL)/finfo?name=%T(zName)">%h(zName)</a> 713b8be852 2009-08-28 drh: @ version <a href="%s(g.zBaseURL)/artifact/%s(zOld)">[%s(zOld)]</a></p> 713b8be852 2009-08-28 drh: continue; 713b8be852 2009-08-28 drh: }else{ 713b8be852 2009-08-28 drh: @ <p>Added <a href="%s(g.zBaseURL)/finfo?name=%T(zName)">%h(zName)</a> 713b8be852 2009-08-28 drh: @ version <a href="%s(g.zBaseURL)/artifact/%s(zNew)">[%s(zNew)]</a></p> 713b8be852 2009-08-28 drh: } 713b8be852 2009-08-28 drh: @ <blockquote><pre> 713b8be852 2009-08-28 drh: append_diff(pid, fid); 713b8be852 2009-08-28 drh: @ </pre></blockquote> 713b8be852 2009-08-28 drh: } 713b8be852 2009-08-28 drh: db_finalize(&q); 30d7afe328 2007-08-01 drh: style_footer(); 30d7afe328 2007-08-01 drh: } 30d7afe328 2007-08-01 drh: dbda8d6ce9 2007-07-21 drh: /* dfea940da8 2007-10-09 drh: ** WEBPAGE: winfo 677aa71bca 2007-10-12 drh: ** URL: /winfo?name=RID 677aa71bca 2007-10-12 drh: ** 677aa71bca 2007-10-12 drh: ** Return information about a wiki page. dbda8d6ce9 2007-07-21 drh: */ dfea940da8 2007-10-09 drh: void winfo_page(void){ dbda8d6ce9 2007-07-21 drh: Stmt q; dbda8d6ce9 2007-07-21 drh: int rid; 30d7afe328 2007-08-01 drh: 30d7afe328 2007-08-01 drh: login_check_credentials(); 2b0d4519dc 2008-05-05 drh: if( !g.okRdWiki ){ login_needed(); return; } 677aa71bca 2007-10-12 drh: rid = name_to_rid(PD("name","0")); dbda8d6ce9 2007-07-21 drh: if( rid==0 ){ dfea940da8 2007-10-09 drh: style_header("Wiki Page Information Error"); dbda8d6ce9 2007-07-21 drh: @ No such object: %h(g.argv[2]) dbda8d6ce9 2007-07-21 drh: style_footer(); dbda8d6ce9 2007-07-21 drh: return; dbda8d6ce9 2007-07-21 drh: } dbda8d6ce9 2007-07-21 drh: db_prepare(&q, dfea940da8 2007-10-09 drh: "SELECT substr(tagname, 6, 1000), uuid," dfea940da8 2007-10-09 drh: " datetime(event.mtime, 'localtime'), user" dfea940da8 2007-10-09 drh: " FROM tagxref, tag, blob, event" dfea940da8 2007-10-09 drh: " WHERE tagxref.rid=%d" dfea940da8 2007-10-09 drh: " AND tag.tagid=tagxref.tagid" dfea940da8 2007-10-09 drh: " AND tag.tagname LIKE 'wiki-%%'" dfea940da8 2007-10-09 drh: " AND blob.rid=%d" dfea940da8 2007-10-09 drh: " AND event.objid=%d", dfea940da8 2007-10-09 drh: rid, rid, rid dbda8d6ce9 2007-07-21 drh: ); dbda8d6ce9 2007-07-21 drh: if( db_step(&q)==SQLITE_ROW ){ 86c8768475 2007-08-01 drh: const char *zName = db_column_text(&q, 0); 1a9c6dbfb7 2007-08-01 drh: const char *zUuid = db_column_text(&q, 1); dfea940da8 2007-10-09 drh: char *zTitle = mprintf("Wiki Page %s", zName); 58903a0fec 2009-08-29 drh: const char *zDate = db_column_text(&q,2); 58903a0fec 2009-08-29 drh: const char *zUser = db_column_text(&q,3); dfea940da8 2007-10-09 drh: style_header(zTitle); dfea940da8 2007-10-09 drh: free(zTitle); 2b0d4519dc 2008-05-05 drh: login_anonymous_available(); 34af72801d 2007-11-23 drh: @ <div class="section">Overview</div> dfea940da8 2007-10-09 drh: @ <p><table class="label-value"> dfea940da8 2007-10-09 drh: @ <tr><th>Version:</th><td>%s(zUuid)</td></tr> 58903a0fec 2009-08-29 drh: @ <tr><th>Date:</th><td> 58903a0fec 2009-08-29 drh: hyperlink_to_date(zDate, "</td></tr>"); dfea940da8 2007-10-09 drh: if( g.okSetup ){ dfea940da8 2007-10-09 drh: @ <tr><th>Record ID:</th><td>%d(rid)</td></tr> dfea940da8 2007-10-09 drh: } 58903a0fec 2009-08-29 drh: @ <tr><th>Original User:</th><td> 58903a0fec 2009-08-29 drh: hyperlink_to_user(zUser, zDate, "</td></tr>"); 2b0d4519dc 2008-05-05 drh: if( g.okHistory ){ 2b0d4519dc 2008-05-05 drh: @ <tr><th>Commands:</th> 2b0d4519dc 2008-05-05 drh: @ <td> 2b0d4519dc 2008-05-05 drh: /* @ <a href="%s(g.zBaseURL)/wdiff/%d(rid)">diff</a> | */ 2b0d4519dc 2008-05-05 drh: @ <a href="%s(g.zBaseURL)/whistory?name=%t(zName)">history</a> 2b0d4519dc 2008-05-05 drh: @ | <a href="%s(g.zBaseURL)/artifact/%d(rid)">raw-text</a> 2b0d4519dc 2008-05-05 drh: @ </td> 2b0d4519dc 2008-05-05 drh: @ </tr> 2b0d4519dc 2008-05-05 drh: } dfea940da8 2007-10-09 drh: @ </table></p> dfea940da8 2007-10-09 drh: }else{ dfea940da8 2007-10-09 drh: style_header("Wiki Information"); 3122fc4c7e 2008-02-14 drh: rid = 0; dbda8d6ce9 2007-07-21 drh: } dbda8d6ce9 2007-07-21 drh: db_finalize(&q); 3122fc4c7e 2008-02-14 drh: showTags(rid, "wiki-*"); 3122fc4c7e 2008-02-14 drh: if( rid ){ 3122fc4c7e 2008-02-14 drh: Blob content; 3122fc4c7e 2008-02-14 drh: Manifest m; 3122fc4c7e 2008-02-14 drh: memset(&m, 0, sizeof(m)); 3122fc4c7e 2008-02-14 drh: blob_zero(&m.content); 3122fc4c7e 2008-02-14 drh: content_get(rid, &content); 3122fc4c7e 2008-02-14 drh: manifest_parse(&m, &content); 3122fc4c7e 2008-02-14 drh: if( m.type==CFTYPE_WIKI ){ 3122fc4c7e 2008-02-14 drh: Blob wiki; 3122fc4c7e 2008-02-14 drh: blob_init(&wiki, m.zWiki, -1); 3122fc4c7e 2008-02-14 drh: @ <div class="section">Content</div> 3122fc4c7e 2008-02-14 drh: wiki_convert(&wiki, 0, 0); 3122fc4c7e 2008-02-14 drh: blob_reset(&wiki); 3122fc4c7e 2008-02-14 drh: } 3122fc4c7e 2008-02-14 drh: manifest_clear(&m); 3122fc4c7e 2008-02-14 drh: } 86c8768475 2007-08-01 drh: style_footer(); 86c8768475 2007-08-01 drh: } 86c8768475 2007-08-01 drh: 86c8768475 2007-08-01 drh: /* 86c8768475 2007-08-01 drh: ** WEBPAGE: finfo 677aa71bca 2007-10-12 drh: ** URL: /finfo?name=FILENAME 677aa71bca 2007-10-12 drh: ** 677aa71bca 2007-10-12 drh: ** Show the complete change history for a single file. 86c8768475 2007-08-01 drh: */ 86c8768475 2007-08-01 drh: void finfo_page(void){ 86c8768475 2007-08-01 drh: Stmt q; 677aa71bca 2007-10-12 drh: const char *zFilename; 86c8768475 2007-08-01 drh: char zPrevDate[20]; a20dcb5c26 2008-02-04 drh: Blob title; a20dcb5c26 2008-02-04 drh: 86c8768475 2007-08-01 drh: login_check_credentials(); 2b0d4519dc 2008-05-05 drh: if( !g.okRead ){ login_needed(); return; } 86c8768475 2007-08-01 drh: style_header("File History"); 2b0d4519dc 2008-05-05 drh: login_anonymous_available(); 86c8768475 2007-08-01 drh: 86c8768475 2007-08-01 drh: zPrevDate[0] = 0; 677aa71bca 2007-10-12 drh: zFilename = PD("name",""); 86c8768475 2007-08-01 drh: db_prepare(&q, c7fe01fe8e 2009-01-29 drh: "SELECT substr(b.uuid,1,10), datetime(event.mtime,'localtime')," dfea940da8 2007-10-09 drh: " coalesce(event.ecomment, event.comment)," dfea940da8 2007-10-09 drh: " coalesce(event.euser, event.user)," eae7ddfa4e 2008-02-04 drh: " mlink.pid, mlink.fid, mlink.mid, mlink.fnid" c7fe01fe8e 2009-01-29 drh: " FROM mlink, blob b, event" 86c8768475 2007-08-01 drh: " WHERE mlink.fnid=(SELECT fnid FROM filename WHERE name=%Q)" dfea940da8 2007-10-09 drh: " AND b.rid=mlink.fid" 86c8768475 2007-08-01 drh: " AND event.objid=mlink.mid" 86c8768475 2007-08-01 drh: " ORDER BY event.mtime DESC", 677aa71bca 2007-10-12 drh: zFilename 86c8768475 2007-08-01 drh: ); a20dcb5c26 2008-02-04 drh: blob_zero(&title); a20dcb5c26 2008-02-04 drh: blob_appendf(&title, "History of "); a20dcb5c26 2008-02-04 drh: hyperlinked_path(zFilename, &title); a20dcb5c26 2008-02-04 drh: @ <h2>%b(&title)</h2> a20dcb5c26 2008-02-04 drh: blob_reset(&title); 86c8768475 2007-08-01 drh: @ <table cellspacing=0 border=0 cellpadding=0> dbda8d6ce9 2007-07-21 drh: while( db_step(&q)==SQLITE_ROW ){ dbda8d6ce9 2007-07-21 drh: const char *zUuid = db_column_text(&q, 0); 86c8768475 2007-08-01 drh: const char *zDate = db_column_text(&q, 1); c7fe01fe8e 2009-01-29 drh: const char *zCom = db_column_text(&q, 2); c7fe01fe8e 2009-01-29 drh: const char *zUser = db_column_text(&q, 3); c7fe01fe8e 2009-01-29 drh: int fpid = db_column_int(&q, 4); c7fe01fe8e 2009-01-29 drh: int frid = db_column_int(&q, 5); c7fe01fe8e 2009-01-29 drh: int mid = db_column_int(&q, 6); c7fe01fe8e 2009-01-29 drh: int fnid = db_column_int(&q, 7); c7fe01fe8e 2009-01-29 drh: char zShort[20]; 86c8768475 2007-08-01 drh: if( memcmp(zDate, zPrevDate, 10) ){ 86c8768475 2007-08-01 drh: sprintf(zPrevDate, "%.10s", zDate); 86c8768475 2007-08-01 drh: @ <tr><td colspan=3> 53f04b180c 2009-08-11 drh: @ <div class="divider">%s(zPrevDate)</div> dbda8d6ce9 2007-07-21 drh: @ </td></tr> dbda8d6ce9 2007-07-21 drh: } 86c8768475 2007-08-01 drh: @ <tr><td valign="top">%s(&zDate[11])</td> 86c8768475 2007-08-01 drh: @ <td width="20"></td> 86c8768475 2007-08-01 drh: @ <td valign="top" align="left"> c7fe01fe8e 2009-01-29 drh: sqlite3_snprintf(sizeof(zShort), zShort, "%.10s", zUuid); c7fe01fe8e 2009-01-29 drh: if( g.okHistory ){ c7fe01fe8e 2009-01-29 drh: @ <a href="%s(g.zTop)/artifact/%s(zUuid)">[%s(zShort)]</a> c7fe01fe8e 2009-01-29 drh: }else{ c7fe01fe8e 2009-01-29 drh: @ [%s(zShort)] c7fe01fe8e 2009-01-29 drh: } 58903a0fec 2009-08-29 drh: @ %h(zCom) (By: 58903a0fec 2009-08-29 drh: hyperlink_to_user(zUser, zDate, " on"); 58903a0fec 2009-08-29 drh: hyperlink_to_date(zDate, ")"); c7fe01fe8e 2009-01-29 drh: if( g.okHistory ){ 2b0d4519dc 2008-05-05 drh: if( fpid ){ 2b0d4519dc 2008-05-05 drh: @ <a href="%s(g.zBaseURL)/fdiff?v1=%d(fpid)&v2=%d(frid)">[diff]</a> 2b0d4519dc 2008-05-05 drh: } 2b0d4519dc 2008-05-05 drh: @ <a href="%s(g.zBaseURL)/annotate?mid=%d(mid)&fnid=%d(fnid)"> 2b0d4519dc 2008-05-05 drh: @ [annotate]</a> 2b0d4519dc 2008-05-05 drh: @ </td> 2b0d4519dc 2008-05-05 drh: } 86c8768475 2007-08-01 drh: } 86c8768475 2007-08-01 drh: db_finalize(&q); 86c8768475 2007-08-01 drh: @ </table> 86c8768475 2007-08-01 drh: style_footer(); 86c8768475 2007-08-01 drh: } 86c8768475 2007-08-01 drh: 86c8768475 2007-08-01 drh: 9df32e2808 2007-08-01 drh: /* 9df32e2808 2007-08-01 drh: ** WEBPAGE: vdiff 677aa71bca 2007-10-12 drh: ** URL: /vdiff?name=RID 677aa71bca 2007-10-12 drh: ** 677aa71bca 2007-10-12 drh: ** Show all differences for a particular check-in. 9df32e2808 2007-08-01 drh: */ 9df32e2808 2007-08-01 drh: void vdiff_page(void){ 1a9c6dbfb7 2007-08-01 drh: int rid; 1a9c6dbfb7 2007-08-01 drh: Stmt q; 9df32e2808 2007-08-01 drh: char *zUuid; 9df32e2808 2007-08-01 drh: 9df32e2808 2007-08-01 drh: login_check_credentials(); 2b0d4519dc 2008-05-05 drh: if( !g.okRead ){ login_needed(); return; } 2b0d4519dc 2008-05-05 drh: login_anonymous_available(); 677aa71bca 2007-10-12 drh: 677aa71bca 2007-10-12 drh: rid = name_to_rid(PD("name","")); 9df32e2808 2007-08-01 drh: if( rid==0 ){ 68c24b1857 2008-05-16 drh: fossil_redirect_home(); 68c24b1857 2008-05-16 drh: } 5a539f82dc 2009-08-15 drh: zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid); 5a539f82dc 2009-08-15 drh: style_header("Check-in [%.10s]", zUuid); 5a539f82dc 2009-08-15 drh: db_prepare(&q, 5a539f82dc 2009-08-15 drh: "SELECT datetime(mtime), " 5a539f82dc 2009-08-15 drh: " coalesce(event.ecomment,event.comment)," 5a539f82dc 2009-08-15 drh: " coalesce(event.euser,event.user)" 5a539f82dc 2009-08-15 drh: " FROM event WHERE type='ci' AND objid=%d", 5a539f82dc 2009-08-15 drh: rid 5a539f82dc 2009-08-15 drh: ); 5a539f82dc 2009-08-15 drh: while( db_step(&q)==SQLITE_ROW ){ 5a539f82dc 2009-08-15 drh: const char *zDate = db_column_text(&q, 0); 5a539f82dc 2009-08-15 drh: const char *zUser = db_column_text(&q, 2); 5a539f82dc 2009-08-15 drh: const char *zComment = db_column_text(&q, 1); 5a539f82dc 2009-08-15 drh: @ <h2>Check-in %s(zUuid)</h2> b5f4f910b7 2009-08-29 drh: @ <p>Made by b5f4f910b7 2009-08-29 drh: hyperlink_to_user(zUser,zDate," on"); b5f4f910b7 2009-08-29 drh: hyperlink_to_date(zDate, ":"); 5fe3aee839 2009-08-30 drh: @ %w(zComment). 5fe3aee839 2009-08-30 drh: if( g.okHistory ){ 5fe3aee839 2009-08-30 drh: @ <a href="%s(g.zBaseURL)/ci/%s(zUuid)">[details]</a> 5fe3aee839 2009-08-30 drh: } 5fe3aee839 2009-08-30 drh: @ </p><hr> dbda8d6ce9 2007-07-21 drh: } dbda8d6ce9 2007-07-21 drh: db_finalize(&q); 9df32e2808 2007-08-01 drh: db_prepare(&q, 9df32e2808 2007-08-01 drh: "SELECT pid, fid, name" 9df32e2808 2007-08-01 drh: " FROM mlink, filename" 9df32e2808 2007-08-01 drh: " WHERE mlink.mid=%d" 9df32e2808 2007-08-01 drh: " AND filename.fnid=mlink.fnid" 9df32e2808 2007-08-01 drh: " ORDER BY name", 9df32e2808 2007-08-01 drh: rid 9df32e2808 2007-08-01 drh: ); 9df32e2808 2007-08-01 drh: while( db_step(&q)==SQLITE_ROW ){ 9df32e2808 2007-08-01 drh: int pid = db_column_int(&q,0); 9df32e2808 2007-08-01 drh: int fid = db_column_int(&q,1); 9df32e2808 2007-08-01 drh: const char *zName = db_column_text(&q,2); 5fe3aee839 2009-08-30 drh: if( g.okHistory ){ 5fe3aee839 2009-08-30 drh: @ <p><a href="%s(g.zBaseURL)/finfo?name=%T(zName)">%h(zName)</a></p> 5fe3aee839 2009-08-30 drh: }else{ 5fe3aee839 2009-08-30 drh: @ <p>%h(zName)</p> 5fe3aee839 2009-08-30 drh: } 9df32e2808 2007-08-01 drh: @ <blockquote><pre> 9df32e2808 2007-08-01 drh: append_diff(pid, fid); 9df32e2808 2007-08-01 drh: @ </pre></blockquote> 9df32e2808 2007-08-01 drh: } 9df32e2808 2007-08-01 drh: db_finalize(&q); dbda8d6ce9 2007-07-21 drh: style_footer(); dbda8d6ce9 2007-07-21 drh: } dbda8d6ce9 2007-07-21 drh: dbda8d6ce9 2007-07-21 drh: /* 1a9c6dbfb7 2007-08-01 drh: ** Write a description of an object to the www reply. 1a9c6dbfb7 2007-08-01 drh: ** 1a9c6dbfb7 2007-08-01 drh: ** If the object is a file then mention: 1a9c6dbfb7 2007-08-01 drh: ** c7fe01fe8e 2009-01-29 drh: ** * It's artifact ID 1a9c6dbfb7 2007-08-01 drh: ** * All its filenames b5f4f910b7 2009-08-29 drh: ** * The check-in it was part of, with times and users 1a9c6dbfb7 2007-08-01 drh: ** 1a9c6dbfb7 2007-08-01 drh: ** If the object is a manifest, then mention: 1a9c6dbfb7 2007-08-01 drh: ** c7fe01fe8e 2009-01-29 drh: ** * It's artifact ID 1a9c6dbfb7 2007-08-01 drh: ** * date of check-in 1a9c6dbfb7 2007-08-01 drh: ** * Comment & user 1a9c6dbfb7 2007-08-01 drh: */ 7303bfeb12 2008-11-17 drh: static void object_description( 389bf5c4da 2008-11-17 drh: int rid, /* The artifact ID */ 923d644b89 2009-01-28 drh: int linkToView, /* Add viewer link if true */ 923d644b89 2009-01-28 drh: Blob *pDownloadName /* Fill with an appropriate download name */ 389bf5c4da 2008-11-17 drh: ){ 1a9c6dbfb7 2007-08-01 drh: Stmt q; 1a9c6dbfb7 2007-08-01 drh: int cnt = 0; dfea940da8 2007-10-09 drh: int nWiki = 0; 1a9c6dbfb7 2007-08-01 drh: db_prepare(&q, ee544f4843 2009-08-29 drh: "SELECT filename.name, datetime(event.mtime)," 589687d783 2008-08-14 cle: " coalesce(event.ecomment,event.comment)," 3b5514ed82 2007-09-22 drh: " coalesce(event.euser,event.user)," 3b5514ed82 2007-09-22 drh: " b.uuid" 1a9c6dbfb7 2007-08-01 drh: " FROM mlink, filename, event, blob a, blob b" 1a9c6dbfb7 2007-08-01 drh: " WHERE filename.fnid=mlink.fnid" 1a9c6dbfb7 2007-08-01 drh: " AND event.objid=mlink.mid" 1a9c6dbfb7 2007-08-01 drh: " AND a.rid=mlink.fid" 1a9c6dbfb7 2007-08-01 drh: " AND b.rid=mlink.mid" 1a9c6dbfb7 2007-08-01 drh: " AND mlink.fid=%d", 1a9c6dbfb7 2007-08-01 drh: rid 1a9c6dbfb7 2007-08-01 drh: ); 1a9c6dbfb7 2007-08-01 drh: while( db_step(&q)==SQLITE_ROW ){ 1a9c6dbfb7 2007-08-01 drh: const char *zName = db_column_text(&q, 0); 1a9c6dbfb7 2007-08-01 drh: const char *zDate = db_column_text(&q, 1); ee544f4843 2009-08-29 drh: const char *zCom = db_column_text(&q, 2); ee544f4843 2009-08-29 drh: const char *zUser = db_column_text(&q, 3); ee544f4843 2009-08-29 drh: const char *zVers = db_column_text(&q, 4); 5452b32a9f 2008-11-17 drh: if( cnt>0 ){ 5452b32a9f 2008-11-17 drh: @ Also file 5452b32a9f 2008-11-17 drh: }else{ 5452b32a9f 2008-11-17 drh: @ File 5452b32a9f 2008-11-17 drh: } 5fe3aee839 2009-08-30 drh: if( g.okHistory ){ 5fe3aee839 2009-08-30 drh: @ <a href="%s(g.zBaseURL)/finfo?name=%T(zName)">%h(zName)</a> 5fe3aee839 2009-08-30 drh: }else{ 5fe3aee839 2009-08-30 drh: @ %h(zName) 5fe3aee839 2009-08-30 drh: } ee544f4843 2009-08-29 drh: @ part of check-in 1a9c6dbfb7 2007-08-01 drh: hyperlink_to_uuid(zVers); b5f4f910b7 2009-08-29 drh: @ - %w(zCom) by b5f4f910b7 2009-08-29 drh: hyperlink_to_user(zUser,zDate," on"); b5f4f910b7 2009-08-29 drh: hyperlink_to_date(zDate,"."); 1a9c6dbfb7 2007-08-01 drh: cnt++; 923d644b89 2009-01-28 drh: if( pDownloadName && blob_size(pDownloadName)==0 ){ 923d644b89 2009-01-28 drh: blob_append(pDownloadName, zName, -1); 923d644b89 2009-01-28 drh: } 1a9c6dbfb7 2007-08-01 drh: } 1a9c6dbfb7 2007-08-01 drh: db_finalize(&q); 1a9c6dbfb7 2007-08-01 drh: db_prepare(&q, dfea940da8 2007-10-09 drh: "SELECT substr(tagname, 6, 10000), datetime(event.mtime)," ee544f4843 2009-08-29 drh: " coalesce(event.euser, event.user)" ee544f4843 2009-08-29 drh: " FROM tagxref, tag, event" dfea940da8 2007-10-09 drh: " WHERE tagxref.rid=%d" dfea940da8 2007-10-09 drh: " AND tag.tagid=tagxref.tagid" dfea940da8 2007-10-09 drh: " AND tag.tagname LIKE 'wiki-%%'" ee544f4843 2009-08-29 drh: " AND event.objid=tagxref.rid", dfea940da8 2007-10-09 drh: rid 1a9c6dbfb7 2007-08-01 drh: ); 1a9c6dbfb7 2007-08-01 drh: while( db_step(&q)==SQLITE_ROW ){ dfea940da8 2007-10-09 drh: const char *zPagename = db_column_text(&q, 0); dfea940da8 2007-10-09 drh: const char *zDate = db_column_text(&q, 1); dfea940da8 2007-10-09 drh: const char *zUser = db_column_text(&q, 2); 5452b32a9f 2008-11-17 drh: if( cnt>0 ){ 5452b32a9f 2008-11-17 drh: @ Also wiki page 5452b32a9f 2008-11-17 drh: }else{ 5452b32a9f 2008-11-17 drh: @ Wiki page 5452b32a9f 2008-11-17 drh: } 5fe3aee839 2009-08-30 drh: if( g.okHistory ){ 5fe3aee839 2009-08-30 drh: @ [<a href="%s(g.zBaseURL)/wiki?name=%t(zPagename)">%h(zPagename)</a>] 5fe3aee839 2009-08-30 drh: }else{ 5fe3aee839 2009-08-30 drh: @ [%h(zPagename)] 5fe3aee839 2009-08-30 drh: } ee544f4843 2009-08-29 drh: @ by b5f4f910b7 2009-08-29 drh: hyperlink_to_user(zUser,zDate," on"); b5f4f910b7 2009-08-29 drh: hyperlink_to_date(zDate,"."); dfea940da8 2007-10-09 drh: nWiki++; 1a9c6dbfb7 2007-08-01 drh: cnt++; 923d644b89 2009-01-28 drh: if( pDownloadName && blob_size(pDownloadName)==0 ){ 923d644b89 2009-01-28 drh: blob_append(pDownloadName, zPagename, -1); 923d644b89 2009-01-28 drh: } 1a9c6dbfb7 2007-08-01 drh: } 1a9c6dbfb7 2007-08-01 drh: db_finalize(&q); dfea940da8 2007-10-09 drh: if( nWiki==0 ){ dfea940da8 2007-10-09 drh: db_prepare(&q, ee544f4843 2009-08-29 drh: "SELECT datetime(mtime), user, comment, type, uuid" dfea940da8 2007-10-09 drh: " FROM event, blob" dfea940da8 2007-10-09 drh: " WHERE event.objid=%d" dfea940da8 2007-10-09 drh: " AND blob.rid=%d", dfea940da8 2007-10-09 drh: rid, rid dfea940da8 2007-10-09 drh: ); dfea940da8 2007-10-09 drh: while( db_step(&q)==SQLITE_ROW ){ dfea940da8 2007-10-09 drh: const char *zDate = db_column_text(&q, 0); d6ad7aa034 2007-11-22 drh: const char *zUser = db_column_text(&q, 1); dfea940da8 2007-10-09 drh: const char *zCom = db_column_text(&q, 2); ee544f4843 2009-08-29 drh: const char *zType = db_column_text(&q, 3); ee544f4843 2009-08-29 drh: const char *zUuid = db_column_text(&q, 4); 5452b32a9f 2008-11-17 drh: if( cnt>0 ){ 5452b32a9f 2008-11-17 drh: @ Also 5452b32a9f 2008-11-17 drh: } 3122fc4c7e 2008-02-14 drh: if( zType[0]=='w' ){ 3122fc4c7e 2008-02-14 drh: @ Wiki edit 3122fc4c7e 2008-02-14 drh: }else if( zType[0]=='t' ){ 3122fc4c7e 2008-02-14 drh: @ Ticket change 3122fc4c7e 2008-02-14 drh: }else if( zType[0]=='c' ){ b5f4f910b7 2009-08-29 drh: @ Manifest of check-in 3122fc4c7e 2008-02-14 drh: }else{ 3122fc4c7e 2008-02-14 drh: @ Control file referencing 3122fc4c7e 2008-02-14 drh: } dfea940da8 2007-10-09 drh: hyperlink_to_uuid(zUuid); b5f4f910b7 2009-08-29 drh: @ - %w(zCom) by b5f4f910b7 2009-08-29 drh: hyperlink_to_user(zUser,zDate," on"); b5f4f910b7 2009-08-29 drh: hyperlink_to_date(zDate, "."); 923d644b89 2009-01-28 drh: if( pDownloadName && blob_size(pDownloadName)==0 ){ 923d644b89 2009-01-28 drh: blob_append(pDownloadName, zUuid, -1); 923d644b89 2009-01-28 drh: } dfea940da8 2007-10-09 drh: cnt++; dfea940da8 2007-10-09 drh: } dfea940da8 2007-10-09 drh: db_finalize(&q); dfea940da8 2007-10-09 drh: } 1a9c6dbfb7 2007-08-01 drh: if( cnt==0 ){ 72b3b1ad47 2007-09-22 drh: char *zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid); ee544f4843 2009-08-29 drh: @ Control artifact. 923d644b89 2009-01-28 drh: if( pDownloadName && blob_size(pDownloadName)==0 ){ 923d644b89 2009-01-28 drh: blob_append(pDownloadName, zUuid, -1); 923d644b89 2009-01-28 drh: } 5fe3aee839 2009-08-30 drh: }else if( linkToView && g.okHistory ){ 3122fc4c7e 2008-02-14 drh: @ <a href="%s(g.zBaseURL)/artifact/%d(rid)">[view]</a> 1a9c6dbfb7 2007-08-01 drh: } 1a9c6dbfb7 2007-08-01 drh: } 5a539f82dc 2009-08-15 drh: 1a9c6dbfb7 2007-08-01 drh: 3dcaed8d86 2007-07-28 dan: /* 1a9c6dbfb7 2007-08-01 drh: ** WEBPAGE: fdiff dbda8d6ce9 2007-07-21 drh: ** 1a9c6dbfb7 2007-08-01 drh: ** Two arguments, v1 and v2, are integers. Show the difference between 1a9c6dbfb7 2007-08-01 drh: ** the two records. dbda8d6ce9 2007-07-21 drh: */ dbda8d6ce9 2007-07-21 drh: void diff_page(void){ 72b3b1ad47 2007-09-22 drh: int v1 = name_to_rid(PD("v1","0")); 72b3b1ad47 2007-09-22 drh: int v2 = name_to_rid(PD("v2","0")); 1a9c6dbfb7 2007-08-01 drh: Blob c1, c2, diff; 1a9c6dbfb7 2007-08-01 drh: 1a9c6dbfb7 2007-08-01 drh: login_check_credentials(); 2b0d4519dc 2008-05-05 drh: if( !g.okRead ){ login_needed(); return; } 1a9c6dbfb7 2007-08-01 drh: style_header("Diff"); 1a9c6dbfb7 2007-08-01 drh: @ <h2>Differences From:</h2> 1a9c6dbfb7 2007-08-01 drh: @ <blockquote> 923d644b89 2009-01-28 drh: object_description(v1, 1, 0); 1a9c6dbfb7 2007-08-01 drh: @ </blockquote> 1a9c6dbfb7 2007-08-01 drh: @ <h2>To:</h2> 1a9c6dbfb7 2007-08-01 drh: @ <blockquote> 923d644b89 2009-01-28 drh: object_description(v2, 1, 0); 1a9c6dbfb7 2007-08-01 drh: @ </blockquote> 1a9c6dbfb7 2007-08-01 drh: @ <hr> 1a9c6dbfb7 2007-08-01 drh: @ <blockquote><pre> 1a9c6dbfb7 2007-08-01 drh: content_get(v1, &c1); 1a9c6dbfb7 2007-08-01 drh: content_get(v2, &c2); 1a9c6dbfb7 2007-08-01 drh: blob_zero(&diff); 57b2735ebd 2007-11-15 drh: text_diff(&c1, &c2, &diff, 4); 1a9c6dbfb7 2007-08-01 drh: blob_reset(&c1); 1a9c6dbfb7 2007-08-01 drh: blob_reset(&c2); 1a9c6dbfb7 2007-08-01 drh: @ %h(blob_str(&diff)) 1a9c6dbfb7 2007-08-01 drh: @ </pre></blockquote> 1a9c6dbfb7 2007-08-01 drh: blob_reset(&diff); 1a9c6dbfb7 2007-08-01 drh: style_footer(); 1a9c6dbfb7 2007-08-01 drh: } 1a9c6dbfb7 2007-08-01 drh: 1a9c6dbfb7 2007-08-01 drh: /* 389bf5c4da 2008-11-17 drh: ** WEBPAGE: raw 389bf5c4da 2008-11-17 drh: ** URL: /raw?name=ARTIFACTID&m=TYPE 7351b6346d 2008-05-15 drh: ** 389bf5c4da 2008-11-17 drh: ** Return the uninterpreted content of an artifact. Used primarily 389bf5c4da 2008-11-17 drh: ** to view artifacts that are images. 7351b6346d 2008-05-15 drh: */ 389bf5c4da 2008-11-17 drh: void rawartifact_page(void){ 7351b6346d 2008-05-15 drh: int rid; 389bf5c4da 2008-11-17 drh: const char *zMime; 7351b6346d 2008-05-15 drh: Blob content; 7351b6346d 2008-05-15 drh: 7351b6346d 2008-05-15 drh: rid = name_to_rid(PD("name","0")); 389bf5c4da 2008-11-17 drh: zMime = PD("m","application/x-fossil-artifact"); 7351b6346d 2008-05-15 drh: login_check_credentials(); 7351b6346d 2008-05-15 drh: if( !g.okRead ){ login_needed(); return; } 389bf5c4da 2008-11-17 drh: if( rid==0 ){ cgi_redirect("/home"); } 7351b6346d 2008-05-15 drh: content_get(rid, &content); 389bf5c4da 2008-11-17 drh: cgi_set_content_type(zMime); 389bf5c4da 2008-11-17 drh: cgi_set_content(&content); 7351b6346d 2008-05-15 drh: } 7351b6346d 2008-05-15 drh: 7351b6346d 2008-05-15 drh: /* 7303bfeb12 2008-11-17 drh: ** Render a hex dump of a file. 7351b6346d 2008-05-15 drh: */ 7303bfeb12 2008-11-17 drh: static void hexdump(Blob *pBlob){ 7303bfeb12 2008-11-17 drh: const unsigned char *x; 7303bfeb12 2008-11-17 drh: int n, i, j, k; 7303bfeb12 2008-11-17 drh: char zLine[100]; 7303bfeb12 2008-11-17 drh: static const char zHex[] = "0123456789abcdef"; 7303bfeb12 2008-11-17 drh: 7303bfeb12 2008-11-17 drh: x = (const unsigned char*)blob_buffer(pBlob); 7303bfeb12 2008-11-17 drh: n = blob_size(pBlob); 7303bfeb12 2008-11-17 drh: for(i=0; i<n; i+=16){ 7303bfeb12 2008-11-17 drh: j = 0; 7303bfeb12 2008-11-17 drh: zLine[0] = zHex[(i>>24)&0xf]; 7303bfeb12 2008-11-17 drh: zLine[1] = zHex[(i>>16)&0xf]; 7303bfeb12 2008-11-17 drh: zLine[2] = zHex[(i>>8)&0xf]; 7303bfeb12 2008-11-17 drh: zLine[3] = zHex[i&0xf]; 7303bfeb12 2008-11-17 drh: zLine[4] = ':'; 7303bfeb12 2008-11-17 drh: sprintf(zLine, "%04x: ", i); 7303bfeb12 2008-11-17 drh: for(j=0; j<16; j++){ 7303bfeb12 2008-11-17 drh: k = 5+j*3; 7303bfeb12 2008-11-17 drh: zLine[k] = ' '; 7303bfeb12 2008-11-17 drh: if( i+j<n ){ 7303bfeb12 2008-11-17 drh: unsigned char c = x[i+j]; 7303bfeb12 2008-11-17 drh: zLine[k+1] = zHex[c>>4]; 7303bfeb12 2008-11-17 drh: zLine[k+2] = zHex[c&0xf]; 7303bfeb12 2008-11-17 drh: }else{ 7303bfeb12 2008-11-17 drh: zLine[k+1] = ' '; 7303bfeb12 2008-11-17 drh: zLine[k+2] = ' '; 7303bfeb12 2008-11-17 drh: } 7303bfeb12 2008-11-17 drh: } 7303bfeb12 2008-11-17 drh: zLine[53] = ' '; 7303bfeb12 2008-11-17 drh: zLine[54] = ' '; 7303bfeb12 2008-11-17 drh: for(j=0; j<16; j++){ 7303bfeb12 2008-11-17 drh: k = j+55; 7303bfeb12 2008-11-17 drh: if( i+j<n ){ 7303bfeb12 2008-11-17 drh: unsigned char c = x[i+j]; 7303bfeb12 2008-11-17 drh: if( c>=0x20 && c<=0x7e ){ 7303bfeb12 2008-11-17 drh: zLine[k] = c; 7303bfeb12 2008-11-17 drh: }else{ 7303bfeb12 2008-11-17 drh: zLine[k] = '.'; 7303bfeb12 2008-11-17 drh: } 7303bfeb12 2008-11-17 drh: }else{ 7303bfeb12 2008-11-17 drh: zLine[k] = 0; 7351b6346d 2008-05-15 drh: } 7351b6346d 2008-05-15 drh: } 7303bfeb12 2008-11-17 drh: zLine[71] = 0; 7303bfeb12 2008-11-17 drh: @ %h(zLine) 7303bfeb12 2008-11-17 drh: } 7303bfeb12 2008-11-17 drh: } 7303bfeb12 2008-11-17 drh: 7303bfeb12 2008-11-17 drh: /* 7303bfeb12 2008-11-17 drh: ** WEBPAGE: hexdump 7303bfeb12 2008-11-17 drh: ** URL: /hexdump?name=ARTIFACTID 1a9c6dbfb7 2007-08-01 drh: ** 7303bfeb12 2008-11-17 drh: ** Show the complete content of a file identified by ARTIFACTID b2e55c0d4d 2007-09-01 drh: ** as preformatted text. 1a9c6dbfb7 2007-08-01 drh: */ 7303bfeb12 2008-11-17 drh: void hexdump_page(void){ 1a9c6dbfb7 2007-08-01 drh: int rid; 1a9c6dbfb7 2007-08-01 drh: Blob content; 923d644b89 2009-01-28 drh: Blob downloadName; ee544f4843 2009-08-29 drh: char *zUuid; 677aa71bca 2007-10-12 drh: 677aa71bca 2007-10-12 drh: rid = name_to_rid(PD("name","0")); 1a9c6dbfb7 2007-08-01 drh: login_check_credentials(); 7303bfeb12 2008-11-17 drh: if( !g.okRead ){ login_needed(); return; } 7303bfeb12 2008-11-17 drh: if( rid==0 ){ cgi_redirect("/home"); } 7303bfeb12 2008-11-17 drh: if( g.okAdmin ){ 7303bfeb12 2008-11-17 drh: const char *zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", rid); 7303bfeb12 2008-11-17 drh: if( db_exists("SELECT 1 FROM shun WHERE uuid='%s'", zUuid) ){ 7303bfeb12 2008-11-17 drh: style_submenu_element("Unshun","Unshun", "%s/shun?uuid=%s&sub=1", 7303bfeb12 2008-11-17 drh: g.zTop, zUuid); 7303bfeb12 2008-11-17 drh: }else{ 7303bfeb12 2008-11-17 drh: style_submenu_element("Shun","Shun", "%s/shun?shun=%s#addshun", 7303bfeb12 2008-11-17 drh: g.zTop, zUuid); 7303bfeb12 2008-11-17 drh: } 7303bfeb12 2008-11-17 drh: } 7303bfeb12 2008-11-17 drh: style_header("Hex Artifact Content"); ee544f4843 2009-08-29 drh: zUuid = db_text("?","SELECT uuid FROM blob WHERE rid=%d", rid); ee544f4843 2009-08-29 drh: @ <h2>Artifact %s(zUuid):</h2> 1a9c6dbfb7 2007-08-01 drh: @ <blockquote> 923d644b89 2009-01-28 drh: blob_zero(&downloadName); 923d644b89 2009-01-28 drh: object_description(rid, 0, &downloadName); 923d644b89 2009-01-28 drh: style_submenu_element("Download", "Download", 923d644b89 2009-01-28 drh: "%s/raw/%T?name=%d", g.zBaseURL, blob_str(&downloadName), rid); 1a9c6dbfb7 2007-08-01 drh: @ </blockquote> 1a9c6dbfb7 2007-08-01 drh: @ <hr> f394d84560 2007-11-25 drh: content_get(rid, &content); 1a9c6dbfb7 2007-08-01 drh: @ <blockquote><pre> 7303bfeb12 2008-11-17 drh: hexdump(&content); 1a9c6dbfb7 2007-08-01 drh: @ </pre></blockquote> 7303bfeb12 2008-11-17 drh: style_footer(); 7351b6346d 2008-05-15 drh: } 7351b6346d 2008-05-15 drh: 7351b6346d 2008-05-15 drh: /* 3122fc4c7e 2008-02-14 drh: ** WEBPAGE: artifact e8c4f69c50 2008-10-24 drh: ** URL: /artifact?name=ARTIFACTID 3122fc4c7e 2008-02-14 drh: ** e8c4f69c50 2008-10-24 drh: ** Show the complete content of a file identified by ARTIFACTID 3122fc4c7e 2008-02-14 drh: ** as preformatted text. 3122fc4c7e 2008-02-14 drh: */ 3122fc4c7e 2008-02-14 drh: void artifact_page(void){ 3122fc4c7e 2008-02-14 drh: int rid; 3122fc4c7e 2008-02-14 drh: Blob content; 389bf5c4da 2008-11-17 drh: const char *zMime; 923d644b89 2009-01-28 drh: Blob downloadName; c7fe01fe8e 2009-01-29 drh: int renderAsWiki = 0; c7fe01fe8e 2009-01-29 drh: int renderAsHtml = 0; ee544f4843 2009-08-29 drh: const char *zUuid; 3122fc4c7e 2008-02-14 drh: 3122fc4c7e 2008-02-14 drh: rid = name_to_rid(PD("name","0")); 3122fc4c7e 2008-02-14 drh: login_check_credentials(); 2b0d4519dc 2008-05-05 drh: if( !g.okRead ){ login_needed(); return; } a48474bc75 2008-05-29 drh: if( rid==0 ){ cgi_redirect("/home"); } a48474bc75 2008-05-29 drh: if( g.okAdmin ){ a48474bc75 2008-05-29 drh: const char *zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", rid); a48474bc75 2008-05-29 drh: if( db_exists("SELECT 1 FROM shun WHERE uuid='%s'", zUuid) ){ a48474bc75 2008-05-29 drh: style_submenu_element("Unshun","Unshun", "%s/shun?uuid=%s&sub=1", a48474bc75 2008-05-29 drh: g.zTop, zUuid); 7351b6346d 2008-05-15 drh: }else{ 94a93469c8 2008-06-02 drh: style_submenu_element("Shun","Shun", "%s/shun?shun=%s#addshun", a48474bc75 2008-05-29 drh: g.zTop, zUuid); 3122fc4c7e 2008-02-14 drh: } 3122fc4c7e 2008-02-14 drh: } 3122fc4c7e 2008-02-14 drh: style_header("Artifact Content"); ee544f4843 2009-08-29 drh: zUuid = db_text("?", "SELECT uuid FROM blob WHERE rid=%d", rid); ee544f4843 2009-08-29 drh: @ <h2>Artifact %s(zUuid)</h2> 3122fc4c7e 2008-02-14 drh: @ <blockquote> 923d644b89 2009-01-28 drh: blob_zero(&downloadName); 923d644b89 2009-01-28 drh: object_description(rid, 0, &downloadName); 923d644b89 2009-01-28 drh: style_submenu_element("Download", "Download", 923d644b89 2009-01-28 drh: "%s/raw/%T?name=%d", g.zTop, blob_str(&downloadName), rid); d4fedbb4ad 2009-01-28 drh: zMime = mimetype_from_name(blob_str(&downloadName)); 0a2a1b4dde 2009-01-28 drh: if( zMime ){ 0a2a1b4dde 2009-01-28 drh: if( strcmp(zMime, "text/html")==0 ){ c7fe01fe8e 2009-01-29 drh: if( P("txt") ){ c7fe01fe8e 2009-01-29 drh: style_submenu_element("Html", "Html", c7fe01fe8e 2009-01-29 drh: "%s/artifact?name=%d", g.zTop, rid); c7fe01fe8e 2009-01-29 drh: }else{ c7fe01fe8e 2009-01-29 drh: renderAsHtml = 1; c7fe01fe8e 2009-01-29 drh: style_submenu_element("Text", "Text", c7fe01fe8e 2009-01-29 drh: "%s/artifact?name=%d&txt=1", g.zTop, rid); c7fe01fe8e 2009-01-29 drh: } 0a2a1b4dde 2009-01-28 drh: }else if( strcmp(zMime, "application/x-fossil-wiki")==0 ){ c7fe01fe8e 2009-01-29 drh: if( P("txt") ){ c7fe01fe8e 2009-01-29 drh: style_submenu_element("Wiki", "Wiki", c7fe01fe8e 2009-01-29 drh: "%s/artifact?name=%d", g.zTop, rid); c7fe01fe8e 2009-01-29 drh: }else{ c7fe01fe8e 2009-01-29 drh: renderAsWiki = 1; c7fe01fe8e 2009-01-29 drh: style_submenu_element("Text", "Text", c7fe01fe8e 2009-01-29 drh: "%s/artifact?name=%d&txt=1", g.zTop, rid); 7351b6346d 2008-05-15 drh: } 0a2a1b4dde 2009-01-28 drh: } 7303bfeb12 2008-11-17 drh: } 3122fc4c7e 2008-02-14 drh: @ </blockquote> 3122fc4c7e 2008-02-14 drh: @ <hr> b3ee50c946 2008-07-15 drh: content_get(rid, &content); c7fe01fe8e 2009-01-29 drh: if( renderAsWiki ){ c7fe01fe8e 2009-01-29 drh: wiki_convert(&content, 0, 0); c7fe01fe8e 2009-01-29 drh: }else if( renderAsHtml ){ c7fe01fe8e 2009-01-29 drh: @ <div> c7fe01fe8e 2009-01-29 drh: cgi_append_content(blob_buffer(&content), blob_size(&content)); c7fe01fe8e 2009-01-29 drh: @ </div> 389bf5c4da 2008-11-17 drh: }else{ c7fe01fe8e 2009-01-29 drh: zMime = mimetype_from_content(&content); c7fe01fe8e 2009-01-29 drh: @ <blockquote> c7fe01fe8e 2009-01-29 drh: if( zMime==0 ){ c7fe01fe8e 2009-01-29 drh: @ <pre> c7fe01fe8e 2009-01-29 drh: @ %h(blob_str(&content)) c7fe01fe8e 2009-01-29 drh: @ </pre> c7fe01fe8e 2009-01-29 drh: style_submenu_element("Hex","Hex", "%s/hexdump?name=%d", g.zTop, rid); c7fe01fe8e 2009-01-29 drh: }else if( strncmp(zMime, "image/", 6)==0 ){ c7fe01fe8e 2009-01-29 drh: @ <img src="%s(g.zBaseURL)/raw?name=%d(rid)&m=%s(zMime)"></img> c7fe01fe8e 2009-01-29 drh: style_submenu_element("Hex","Hex", "%s/hexdump?name=%d", g.zTop, rid); c7fe01fe8e 2009-01-29 drh: }else{ c7fe01fe8e 2009-01-29 drh: @ <pre> c7fe01fe8e 2009-01-29 drh: hexdump(&content); c7fe01fe8e 2009-01-29 drh: @ </pre> c7fe01fe8e 2009-01-29 drh: } c7fe01fe8e 2009-01-29 drh: @ </blockquote> 389bf5c4da 2008-11-17 drh: } c8a78004ce 2008-10-20 drh: style_footer(); b3ee50c946 2008-07-15 drh: } b3ee50c946 2008-07-15 drh: b3ee50c946 2008-07-15 drh: /* b3ee50c946 2008-07-15 drh: ** WEBPAGE: tinfo e8c4f69c50 2008-10-24 drh: ** URL: /tinfo?name=ARTIFACTID b3ee50c946 2008-07-15 drh: ** b3ee50c946 2008-07-15 drh: ** Show the details of a ticket change control artifact. b3ee50c946 2008-07-15 drh: */ b3ee50c946 2008-07-15 drh: void tinfo_page(void){ b3ee50c946 2008-07-15 drh: int rid; b3ee50c946 2008-07-15 drh: Blob content; b3ee50c946 2008-07-15 drh: char *zDate; b3ee50c946 2008-07-15 drh: const char *zUuid; b3ee50c946 2008-07-15 drh: char zTktName[20]; b3ee50c946 2008-07-15 drh: Manifest m; b3ee50c946 2008-07-15 drh: b3ee50c946 2008-07-15 drh: login_check_credentials(); b3ee50c946 2008-07-15 drh: if( !g.okRdTkt ){ login_needed(); return; } b3ee50c946 2008-07-15 drh: rid = name_to_rid(PD("name","0")); b3ee50c946 2008-07-15 drh: if( rid==0 ){ fossil_redirect_home(); } b3ee50c946 2008-07-15 drh: zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", rid); b3ee50c946 2008-07-15 drh: if( g.okAdmin ){ b3ee50c946 2008-07-15 drh: if( db_exists("SELECT 1 FROM shun WHERE uuid='%s'", zUuid) ){ b3ee50c946 2008-07-15 drh: style_submenu_element("Unshun","Unshun", "%s/shun?uuid=%s&sub=1", b3ee50c946 2008-07-15 drh: g.zTop, zUuid); b3ee50c946 2008-07-15 drh: }else{ b3ee50c946 2008-07-15 drh: style_submenu_element("Shun","Shun", "%s/shun?shun=%s#addshun", b3ee50c946 2008-07-15 drh: g.zTop, zUuid); b3ee50c946 2008-07-15 drh: } b3ee50c946 2008-07-15 drh: } 3122fc4c7e 2008-02-14 drh: content_get(rid, &content); b3ee50c946 2008-07-15 drh: if( manifest_parse(&m, &content)==0 ){ b3ee50c946 2008-07-15 drh: fossil_redirect_home(); b3ee50c946 2008-07-15 drh: } b3ee50c946 2008-07-15 drh: if( m.type!=CFTYPE_TICKET ){ b3ee50c946 2008-07-15 drh: fossil_redirect_home(); b3ee50c946 2008-07-15 drh: } b3ee50c946 2008-07-15 drh: style_header("Ticket Change Details"); b3ee50c946 2008-07-15 drh: zDate = db_text(0, "SELECT datetime(%.12f)", m.rDate); b3ee50c946 2008-07-15 drh: memcpy(zTktName, m.zTicketUuid, 10); b3ee50c946 2008-07-15 drh: zTktName[10] = 0; 5fe3aee839 2009-08-30 drh: if( g.okHistory ){ 5fe3aee839 2009-08-30 drh: @ <h2>Changes to ticket <a href="%s(m.zTicketUuid)">%s(zTktName)</a></h2> 5fe3aee839 2009-08-30 drh: @ 5fe3aee839 2009-08-30 drh: @ <p>By %h(m.zUser) on %s(zDate). See also: 5fe3aee839 2009-08-30 drh: @ <a href="%s(g.zTop)/artifact/%T(zUuid)">artifact content</a>, and 5fe3aee839 2009-08-30 drh: @ <a href="%s(g.zTop)/tkthistory/%s(m.zTicketUuid)">ticket history</a> dbda8d6ce9 2007-07-21 drh: @ </p> dbda8d6ce9 2007-07-21 drh: }else{ 5fe3aee839 2009-08-30 drh: @ <h2>Changes to ticket %s(zTktName)</h2> 5fe3aee839 2009-08-30 drh: @ 5fe3aee839 2009-08-30 drh: @ <p>By %h(m.zUser) on %s(zDate). dbda8d6ce9 2007-07-21 drh: @ </p> 5fe3aee839 2009-08-30 drh: } b3ee50c946 2008-07-15 drh: @ b3ee50c946 2008-07-15 drh: @ <ol> b3ee50c946 2008-07-15 drh: free(zDate); c8a78004ce 2008-10-20 drh: ticket_output_change_artifact(&m); c8a78004ce 2008-10-20 drh: manifest_clear(&m); dbda8d6ce9 2007-07-21 drh: style_footer(); f394d84560 2007-11-25 drh: } b3ee50c946 2008-07-15 drh: f394d84560 2007-11-25 drh: f394d84560 2007-11-25 drh: /* f394d84560 2007-11-25 drh: ** WEBPAGE: info e8c4f69c50 2008-10-24 drh: ** URL: info/ARTIFACTID 3122fc4c7e 2008-02-14 drh: ** e8c4f69c50 2008-10-24 drh: ** The argument is a artifact ID which might be a baseline or a file or 3122fc4c7e 2008-02-14 drh: ** a ticket changes or a wiki editor or something else. f394d84560 2007-11-25 drh: ** e8c4f69c50 2008-10-24 drh: ** Figure out what the artifact ID is and jump to it. f394d84560 2007-11-25 drh: */ f394d84560 2007-11-25 drh: void info_page(void){ f394d84560 2007-11-25 drh: const char *zName; 3984b1b2c1 2008-08-04 eric: Blob uuid; 3122fc4c7e 2008-02-14 drh: int rid, nName; f394d84560 2007-11-25 drh: f394d84560 2007-11-25 drh: zName = P("name"); 68c24b1857 2008-05-16 drh: if( zName==0 ) fossil_redirect_home(); f394d84560 2007-11-25 drh: nName = strlen(zName); f394d84560 2007-11-25 drh: if( nName<4 || nName>UUID_SIZE || !validate16(zName, nName) ){ 3984b1b2c1 2008-08-04 eric: switch( sym_tag_to_uuid(zName, &uuid) ){ 3984b1b2c1 2008-08-04 eric: case 1: { 3984b1b2c1 2008-08-04 eric: /* got one UUID, use it */ 3984b1b2c1 2008-08-04 eric: zName = blob_str(&uuid); 3984b1b2c1 2008-08-04 eric: break; 3984b1b2c1 2008-08-04 eric: } 3984b1b2c1 2008-08-04 eric: case 2: { 3984b1b2c1 2008-08-04 eric: /* go somewhere to show the multiple UUIDs */ 3984b1b2c1 2008-08-04 eric: return; 3984b1b2c1 2008-08-04 eric: break; 3984b1b2c1 2008-08-04 eric: } 3984b1b2c1 2008-08-04 eric: default: { 3984b1b2c1 2008-08-04 eric: fossil_redirect_home(); 3984b1b2c1 2008-08-04 eric: break; 3984b1b2c1 2008-08-04 eric: } 3984b1b2c1 2008-08-04 eric: } 68c24b1857 2008-05-16 drh: } 68c24b1857 2008-05-16 drh: if( db_exists("SELECT 1 FROM ticket WHERE tkt_uuid GLOB '%s*'", zName) ){ 68c24b1857 2008-05-16 drh: tktview_page(); 68c24b1857 2008-05-16 drh: return; f394d84560 2007-11-25 drh: } 16e765bac5 2008-02-25 drh: rid = db_int(0, "SELECT rid FROM blob WHERE uuid GLOB '%s*'", zName); 3122fc4c7e 2008-02-14 drh: if( rid==0 ){ f394d84560 2007-11-25 drh: style_header("Broken Link"); f394d84560 2007-11-25 drh: @ <p>No such object: %h(zName)</p> f394d84560 2007-11-25 drh: style_footer(); f394d84560 2007-11-25 drh: return; f394d84560 2007-11-25 drh: } 3122fc4c7e 2008-02-14 drh: if( db_exists("SELECT 1 FROM mlink WHERE mid=%d", rid) ){ 9be1b00392 2009-01-25 drh: ci_page(); a48474bc75 2008-05-29 drh: }else a48474bc75 2008-05-29 drh: if( db_exists("SELECT 1 FROM tagxref JOIN tag USING(tagid)" a48474bc75 2008-05-29 drh: " WHERE rid=%d AND tagname LIKE 'wiki-%%'", rid) ){ a48474bc75 2008-05-29 drh: winfo_page(); a48474bc75 2008-05-29 drh: }else b3ee50c946 2008-07-15 drh: if( db_exists("SELECT 1 FROM tagxref JOIN tag USING(tagid)" b3ee50c946 2008-07-15 drh: " WHERE rid=%d AND tagname LIKE 'tkt-%%'", rid) ){ b3ee50c946 2008-07-15 drh: tinfo_page(); b3ee50c946 2008-07-15 drh: }else 3b3116e490 2009-01-20 drh: if( db_exists("SELECT 1 FROM plink WHERE cid=%d", rid) ){ 9be1b00392 2009-01-25 drh: ci_page(); 3122fc4c7e 2008-02-14 drh: }else 9c89b0e0f1 2009-01-25 drh: if( db_exists("SELECT 1 FROM plink WHERE pid=%d", rid) ){ 9be1b00392 2009-01-25 drh: ci_page(); 3122fc4c7e 2008-02-14 drh: }else 3122fc4c7e 2008-02-14 drh: { 3122fc4c7e 2008-02-14 drh: artifact_page(); 3122fc4c7e 2008-02-14 drh: } dbda8d6ce9 2007-07-21 drh: } f0474b87b0 2008-07-19 drh: f0474b87b0 2008-07-19 drh: /* 9be1b00392 2009-01-25 drh: ** WEBPAGE: ci_edit 9be1b00392 2009-01-25 drh: ** URL: ci_edit?r=RID&c=NEWCOMMENT&u=NEWUSER f0474b87b0 2008-07-19 drh: ** f0474b87b0 2008-07-19 drh: ** Present a dialog for updating properties of a baseline: f0474b87b0 2008-07-19 drh: ** f0474b87b0 2008-07-19 drh: ** * The check-in user f0474b87b0 2008-07-19 drh: ** * The check-in comment f0474b87b0 2008-07-19 drh: ** * The background color. f0474b87b0 2008-07-19 drh: */ 9be1b00392 2009-01-25 drh: void ci_edit_page(void){ f0474b87b0 2008-07-19 drh: int rid; ac03d43348 2009-08-21 drh: const char *zComment; /* Current comment on the check-in */ ac03d43348 2009-08-21 drh: const char *zNewComment; /* Revised check-in comment */ ac03d43348 2009-08-21 drh: const char *zUser; /* Current user for the check-in */ ac03d43348 2009-08-21 drh: const char *zNewUser; /* Revised user */ ac03d43348 2009-08-21 drh: const char *zDate; /* Current date of the check-in */ ac03d43348 2009-08-21 drh: const char *zNewDate; /* Revised check-in date */ b7f32a71ab 2009-01-20 drh: const char *zColor; b7f32a71ab 2009-01-20 drh: const char *zNewColor; 73c23a4279 2009-01-22 drh: const char *zNewTagFlag; 42c2a18e73 2009-01-22 drh: const char *zNewTag; 73c23a4279 2009-01-22 drh: const char *zNewBrFlag; 42c2a18e73 2009-01-22 drh: const char *zNewBranch; 73c23a4279 2009-01-22 drh: const char *zCloseFlag; b7f32a71ab 2009-01-20 drh: int fPropagateColor; f0474b87b0 2008-07-19 drh: char *zUuid; f0474b87b0 2008-07-19 drh: Blob comment; 42c2a18e73 2009-01-22 drh: Stmt q; b7f32a71ab 2009-01-20 drh: static const struct SampleColors { b7f32a71ab 2009-01-20 drh: const char *zCName; b7f32a71ab 2009-01-20 drh: const char *zColor; b7f32a71ab 2009-01-20 drh: } aColor[] = { b7f32a71ab 2009-01-20 drh: { "(none)", "" }, 9c256a46b7 2009-01-21 drh: { "#f2dcdc", "#f2dcdc" }, 9c256a46b7 2009-01-21 drh: { "#f0ffc0", "#f0ffc0" }, 9c256a46b7 2009-01-21 drh: { "#bde5d6", "#bde5d6" }, b7f32a71ab 2009-01-20 drh: { "#c0ffc0", "#c0ffc0" }, b7f32a71ab 2009-01-20 drh: { "#c0fff0", "#c0fff0" }, b7f32a71ab 2009-01-20 drh: { "#c0f0ff", "#c0f0ff" }, b7f32a71ab 2009-01-20 drh: { "#d0c0ff", "#d0c0ff" }, b7f32a71ab 2009-01-20 drh: { "#ffc0ff", "#ffc0ff" }, b7f32a71ab 2009-01-20 drh: { "#ffc0d0", "#ffc0d0" }, b7f32a71ab 2009-01-20 drh: { "#fff0c0", "#fff0c0" }, 3b3116e490 2009-01-20 drh: { "#c0c0c0", "#c0c0c0" }, b7f32a71ab 2009-01-20 drh: }; 73c23a4279 2009-01-22 drh: int nColor = sizeof(aColor)/sizeof(aColor[0]); b7f32a71ab 2009-01-20 drh: int i; f0474b87b0 2008-07-19 drh: f0474b87b0 2008-07-19 drh: login_check_credentials(); f0474b87b0 2008-07-19 drh: if( !g.okWrite ){ login_needed(); return; } f0474b87b0 2008-07-19 drh: rid = atoi(PD("r","0")); 42c2a18e73 2009-01-22 drh: zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid); f0474b87b0 2008-07-19 drh: zComment = db_text(0, "SELECT coalesce(ecomment,comment)" f0474b87b0 2008-07-19 drh: " FROM event WHERE objid=%d", rid); f0474b87b0 2008-07-19 drh: if( zComment==0 ) fossil_redirect_home(); 42c2a18e73 2009-01-22 drh: if( P("cancel") ){ 9be1b00392 2009-01-25 drh: cgi_redirectf("ci?name=%d", rid); 42c2a18e73 2009-01-22 drh: } f0474b87b0 2008-07-19 drh: zNewComment = PD("c",zComment); f0474b87b0 2008-07-19 drh: zUser = db_text(0, "SELECT coalesce(euser,user)" f0474b87b0 2008-07-19 drh: " FROM event WHERE objid=%d", rid); f0474b87b0 2008-07-19 drh: if( zUser==0 ) fossil_redirect_home(); f0474b87b0 2008-07-19 drh: zNewUser = PD("u",zUser); ac03d43348 2009-08-21 drh: zDate = db_text(0, "SELECT datetime(mtime)" ac03d43348 2009-08-21 drh: " FROM event WHERE objid=%d", rid); ac03d43348 2009-08-21 drh: if( zDate==0 ) fossil_redirect_home(); ac03d43348 2009-08-21 drh: zNewDate = PD("dt",zDate); b7f32a71ab 2009-01-20 drh: zColor = db_text("", "SELECT bgcolor" b7f32a71ab 2009-01-20 drh: " FROM event WHERE objid=%d", rid); b7f32a71ab 2009-01-20 drh: zNewColor = PD("clr",zColor); b7f32a71ab 2009-01-20 drh: fPropagateColor = P("pclr")!=0; 73c23a4279 2009-01-22 drh: zNewTagFlag = P("newtag") ? " checked" : ""; 73c23a4279 2009-01-22 drh: zNewTag = PD("tagname",""); 73c23a4279 2009-01-22 drh: zNewBrFlag = P("newbr") ? " checked" : ""; 73c23a4279 2009-01-22 drh: zNewBranch = PD("brname",""); 73c23a4279 2009-01-22 drh: zCloseFlag = P("close") ? " checked" : ""; f0474b87b0 2008-07-19 drh: if( P("apply") ){ f0474b87b0 2008-07-19 drh: Blob ctrl; f0474b87b0 2008-07-19 drh: char *zDate; f0474b87b0 2008-07-19 drh: int nChng = 0; f0474b87b0 2008-07-19 drh: 0be54823ba 2008-10-18 drh: login_verify_csrf_secret(); f0474b87b0 2008-07-19 drh: blob_zero(&ctrl); f0474b87b0 2008-07-19 drh: zDate = db_text(0, "SELECT datetime('now')"); f0474b87b0 2008-07-19 drh: zDate[10] = 'T'; f0474b87b0 2008-07-19 drh: blob_appendf(&ctrl, "D %s\n", zDate); 42c2a18e73 2009-01-22 drh: db_multi_exec("CREATE TEMP TABLE newtags(tag UNIQUE, prefix, value)"); b7f32a71ab 2009-01-20 drh: if( zNewColor[0] && strcmp(zColor,zNewColor)!=0 ){ 42c2a18e73 2009-01-22 drh: char *zPrefix = "+"; b7f32a71ab 2009-01-20 drh: if( fPropagateColor ){ 42c2a18e73 2009-01-22 drh: zPrefix = "*"; b7f32a71ab 2009-01-20 drh: } 42c2a18e73 2009-01-22 drh: db_multi_exec("REPLACE INTO newtags VALUES('bgcolor',%Q,%Q)", 42c2a18e73 2009-01-22 drh: zPrefix, zNewColor); 42c2a18e73 2009-01-22 drh: } 42c2a18e73 2009-01-22 drh: if( zNewColor[0]==0 && zColor[0]!=0 ){ 42c2a18e73 2009-01-22 drh: db_multi_exec("REPLACE INTO newtags VALUES('bgcolor','-',NULL)"); b7f32a71ab 2009-01-20 drh: } f0474b87b0 2008-07-19 drh: if( strcmp(zComment,zNewComment)!=0 ){ 42c2a18e73 2009-01-22 drh: db_multi_exec("REPLACE INTO newtags VALUES('comment','+',%Q)", 42c2a18e73 2009-01-22 drh: zNewComment); 42c2a18e73 2009-01-22 drh: } ac03d43348 2009-08-21 drh: if( strcmp(zDate,zNewDate)!=0 ){ ac03d43348 2009-08-21 drh: db_multi_exec("REPLACE INTO newtags VALUES('date','+',%Q)", ac03d43348 2009-08-21 drh: zNewDate); f0474b87b0 2008-07-19 drh: } f0474b87b0 2008-07-19 drh: if( strcmp(zUser,zNewUser)!=0 ){ 42c2a18e73 2009-01-22 drh: db_multi_exec("REPLACE INTO newtags VALUES('user','+',%Q)", zNewUser); 42c2a18e73 2009-01-22 drh: } 73c23a4279 2009-01-22 drh: db_prepare(&q, 73c23a4279 2009-01-22 drh: "SELECT tag.tagid, tagname FROM tagxref, tag" 73c23a4279 2009-01-22 drh: " WHERE tagxref.rid=%d AND tagtype>0 AND tagxref.tagid=tag.tagid", 73c23a4279 2009-01-22 drh: rid 73c23a4279 2009-01-22 drh: ); 73c23a4279 2009-01-22 drh: while( db_step(&q)==SQLITE_ROW ){ 73c23a4279 2009-01-22 drh: int tagid = db_column_int(&q, 0); 73c23a4279 2009-01-22 drh: const char *zTag = db_column_text(&q, 1); 73c23a4279 2009-01-22 drh: char zLabel[30]; 73c23a4279 2009-01-22 drh: sprintf(zLabel, "c%d", tagid); 73c23a4279 2009-01-22 drh: if( P(zLabel) ){ 73c23a4279 2009-01-22 drh: db_multi_exec("REPLACE INTO newtags VALUES(%Q,'-',NULL)", zTag); 73c23a4279 2009-01-22 drh: } 73c23a4279 2009-01-22 drh: } 73c23a4279 2009-01-22 drh: db_finalize(&q); 73c23a4279 2009-01-22 drh: if( zCloseFlag[0] ){ 73c23a4279 2009-01-22 drh: db_multi_exec("REPLACE INTO newtags VALUES('closed','+',NULL)"); 73c23a4279 2009-01-22 drh: } 73c23a4279 2009-01-22 drh: if( zNewTagFlag[0] ){ 42c2a18e73 2009-01-22 drh: db_multi_exec("REPLACE INTO newtags VALUES('sym-%q','+',NULL)", zNewTag); 42c2a18e73 2009-01-22 drh: } 73c23a4279 2009-01-22 drh: if( zNewBrFlag[0] ){ 42c2a18e73 2009-01-22 drh: db_multi_exec( 42c2a18e73 2009-01-22 drh: "REPLACE INTO newtags " 42c2a18e73 2009-01-22 drh: " SELECT tagname, '-', NULL FROM tagxref, tag" 42c2a18e73 2009-01-22 drh: " WHERE tagxref.rid=%d AND tagtype==2" 42c2a18e73 2009-01-22 drh: " AND tagname GLOB 'sym-*'" 42c2a18e73 2009-01-22 drh: " AND tag.tagid=tagxref.tagid", 42c2a18e73 2009-01-22 drh: rid 42c2a18e73 2009-01-22 drh: ); 42c2a18e73 2009-01-22 drh: db_multi_exec("REPLACE INTO newtags VALUES('branch','*',%Q)", zNewBranch); 42c2a18e73 2009-01-22 drh: db_multi_exec("REPLACE INTO newtags VALUES('sym-%q','*',NULL)", 42c2a18e73 2009-01-22 drh: zNewBranch); b7f32a71ab 2009-01-20 drh: } 42c2a18e73 2009-01-22 drh: db_prepare(&q, "SELECT tag, prefix, value FROM newtags" 42c2a18e73 2009-01-22 drh: " ORDER BY prefix || tag"); 42c2a18e73 2009-01-22 drh: while( db_step(&q)==SQLITE_ROW ){ 42c2a18e73 2009-01-22 drh: const char *zTag = db_column_text(&q, 0); 42c2a18e73 2009-01-22 drh: const char *zPrefix = db_column_text(&q, 1); 42c2a18e73 2009-01-22 drh: const char *zValue = db_column_text(&q, 2); f0474b87b0 2008-07-19 drh: nChng++; 42c2a18e73 2009-01-22 drh: if( zValue ){ 42c2a18e73 2009-01-22 drh: blob_appendf(&ctrl, "T %s%F %s %F\n", zPrefix, zTag, zUuid, zValue); 42c2a18e73 2009-01-22 drh: }else{ 42c2a18e73 2009-01-22 drh: blob_appendf(&ctrl, "T %s%F %s\n", zPrefix, zTag, zUuid); 42c2a18e73 2009-01-22 drh: } f0474b87b0 2008-07-19 drh: } f394d84560 2007-11-25 drh: db_finalize(&q); f0474b87b0 2008-07-19 drh: if( nChng>0 ){ f0474b87b0 2008-07-19 drh: int nrid; f0474b87b0 2008-07-19 drh: Blob cksum; f0474b87b0 2008-07-19 drh: blob_appendf(&ctrl, "U %F\n", g.zLogin); f0474b87b0 2008-07-19 drh: md5sum_blob(&ctrl, &cksum); f0474b87b0 2008-07-19 drh: blob_appendf(&ctrl, "Z %b\n", &cksum); f0474b87b0 2008-07-19 drh: db_begin_transaction(); 02a584f7f5 2009-08-26 drh: g.markPrivate = content_is_private(rid); f0474b87b0 2008-07-19 drh: nrid = content_put(&ctrl, 0, 0); f0474b87b0 2008-07-19 drh: manifest_crosslink(nrid, &ctrl); f0474b87b0 2008-07-19 drh: db_end_transaction(0); f0474b87b0 2008-07-19 drh: } 9be1b00392 2009-01-25 drh: cgi_redirectf("ci?name=%d", rid); f0474b87b0 2008-07-19 drh: } 89de100a2d 2008-07-24 drh: blob_zero(&comment); 89de100a2d 2008-07-24 drh: blob_append(&comment, zNewComment, -1); f0474b87b0 2008-07-19 drh: zUuid[10] = 0; e8d3e327f1 2009-01-22 drh: style_header("Edit Check-in [%s]", zUuid); b7f32a71ab 2009-01-20 drh: if( P("preview") ){ 42c2a18e73 2009-01-22 drh: Blob suffix; 42c2a18e73 2009-01-22 drh: int nTag = 0; b7f32a71ab 2009-01-20 drh: @ <b>Preview:</b> b7f32a71ab 2009-01-20 drh: @ <blockquote> b7f32a71ab 2009-01-20 drh: @ <table border=0> b7f32a71ab 2009-01-20 drh: if( zNewColor && zNewColor[0] ){ b7f32a71ab 2009-01-20 drh: @ <tr><td bgcolor="%h(zNewColor)"> f394d84560 2007-11-25 drh: }else{ b7f32a71ab 2009-01-20 drh: @ <tr><td> b7f32a71ab 2009-01-20 drh: } b7f32a71ab 2009-01-20 drh: wiki_convert(&comment, 0, WIKI_INLINE); 42c2a18e73 2009-01-22 drh: blob_zero(&suffix); 42c2a18e73 2009-01-22 drh: blob_appendf(&suffix, "(user: %h", zNewUser); 42c2a18e73 2009-01-22 drh: db_prepare(&q, "SELECT substr(tagname,5) FROM tagxref, tag" 42c2a18e73 2009-01-22 drh: " WHERE tagname GLOB 'sym-*' AND tagxref.rid=%d" 42c2a18e73 2009-01-22 drh: " AND tagtype>1 AND tag.tagid=tagxref.tagid", 42c2a18e73 2009-01-22 drh: rid); 42c2a18e73 2009-01-22 drh: while( db_step(&q)==SQLITE_ROW ){ 42c2a18e73 2009-01-22 drh: const char *zTag = db_column_text(&q, 0); 42c2a18e73 2009-01-22 drh: if( nTag==0 ){ 42c2a18e73 2009-01-22 drh: blob_appendf(&suffix, ", tags: %h", zTag); f394d84560 2007-11-25 drh: }else{ 42c2a18e73 2009-01-22 drh: blob_appendf(&suffix, ", %h", zTag); f394d84560 2007-11-25 drh: } 42c2a18e73 2009-01-22 drh: nTag++; 42c2a18e73 2009-01-22 drh: } 42c2a18e73 2009-01-22 drh: db_finalize(&q); 42c2a18e73 2009-01-22 drh: blob_appendf(&suffix, ")"); 42c2a18e73 2009-01-22 drh: @ %s(blob_str(&suffix)) b7f32a71ab 2009-01-20 drh: @ </td></tr></table> b7f32a71ab 2009-01-20 drh: @ </blockquote> b7f32a71ab 2009-01-20 drh: @ <hr> 42c2a18e73 2009-01-22 drh: blob_reset(&suffix); b7f32a71ab 2009-01-20 drh: } b7f32a71ab 2009-01-20 drh: @ <p>Make changes to attributes of check-in 9be1b00392 2009-01-25 drh: @ [<a href="ci?name=%d(rid)">%s(zUuid)</a>]:</p> 9be1b00392 2009-01-25 drh: @ <form action="%s(g.zBaseURL)/ci_edit" method="POST"> 0be54823ba 2008-10-18 drh: login_insert_csrf_secret(); f0474b87b0 2008-07-19 drh: @ <input type="hidden" name="r" value="%d(rid)"> b7f32a71ab 2009-01-20 drh: @ <table border="0" cellspacing="10"> b7f32a71ab 2009-01-20 drh: b7f32a71ab 2009-01-20 drh: @ <tr><td align="right" valign="top"><b>User:</b></td> b7f32a71ab 2009-01-20 drh: @ <td valign="top"> b7f32a71ab 2009-01-20 drh: @ <input type="text" name="u" size="20" value="%h(zNewUser)"> b7f32a71ab 2009-01-20 drh: @ </td></tr> b7f32a71ab 2009-01-20 drh: b7f32a71ab 2009-01-20 drh: @ <tr><td align="right" valign="top"><b>Comment:</b></td> b7f32a71ab 2009-01-20 drh: @ <td valign="top"> b7f32a71ab 2009-01-20 drh: @ <textarea name="c" rows="10" cols="80">%h(zNewComment)</textarea> b7f32a71ab 2009-01-20 drh: @ </td></tr> b7f32a71ab 2009-01-20 drh: ac03d43348 2009-08-21 drh: @ <tr><td align="right" valign="top"><b>Check-in Time:</b></td> ac03d43348 2009-08-21 drh: @ <td valign="top"> ac03d43348 2009-08-21 drh: @ <input type="text" name="dt" size="20" value="%h(zNewDate)"> 73c23a4279 2009-01-22 drh: @ </td></tr> 73c23a4279 2009-01-22 drh: b7f32a71ab 2009-01-20 drh: @ <tr><td align="right" valign="top"><b>Background Color:</b></td> b7f32a71ab 2009-01-20 drh: @ <td valign="top"> b7f32a71ab 2009-01-20 drh: @ <table border=0 cellpadding=0 cellspacing=1> 73c23a4279 2009-01-22 drh: @ <tr><td colspan="6" align="left"> 73c23a4279 2009-01-22 drh: if( fPropagateColor ){ 73c23a4279 2009-01-22 drh: @ <input type="checkbox" name="pclr" checked> 73c23a4279 2009-01-22 drh: }else{ 73c23a4279 2009-01-22 drh: @ <input type="checkbox" name="pclr"> 73c23a4279 2009-01-22 drh: } 73c23a4279 2009-01-22 drh: @ Propagate color to descendants</input></td></tr> b7f32a71ab 2009-01-20 drh: @ <tr> 73c23a4279 2009-01-22 drh: for(i=0; i<nColor; i++){ b7f32a71ab 2009-01-20 drh: if( aColor[i].zColor[0] ){ b7f32a71ab 2009-01-20 drh: @ <td bgcolor="%h(aColor[i].zColor)"> b7f32a71ab 2009-01-20 drh: }else{ b7f32a71ab 2009-01-20 drh: @ <td> b7f32a71ab 2009-01-20 drh: } b7f32a71ab 2009-01-20 drh: if( strcmp(zNewColor, aColor[i].zColor)==0 ){ b7f32a71ab 2009-01-20 drh: @ <input type="radio" name="clr" value="%h(aColor[i].zColor)" checked> b7f32a71ab 2009-01-20 drh: }else{ b7f32a71ab 2009-01-20 drh: @ <input type="radio" name="clr" value="%h(aColor[i].zColor)"> f394d84560 2007-11-25 drh: } b7f32a71ab 2009-01-20 drh: @ %h(aColor[i].zCName)</input></td> 73c23a4279 2009-01-22 drh: if( (i%6)==5 && i+1<nColor ){ 73c23a4279 2009-01-22 drh: @ </tr><tr> 73c23a4279 2009-01-22 drh: } f394d84560 2007-11-25 drh: } 73c23a4279 2009-01-22 drh: @ </tr> b7f32a71ab 2009-01-20 drh: @ </table> b7f32a71ab 2009-01-20 drh: @ </td></tr> 42c2a18e73 2009-01-22 drh: 42c2a18e73 2009-01-22 drh: @ <tr><td align="right" valign="top"><b>Tags:</b></td> 42c2a18e73 2009-01-22 drh: @ <td valign="top"> 73c23a4279 2009-01-22 drh: @ <input type="checkbox" name="newtag"%s(zNewTagFlag)> 42c2a18e73 2009-01-22 drh: @ Add the following new tag name to this check-in: 73c23a4279 2009-01-22 drh: @ <input type="text" width="15" name="tagname" value="%h(zNewTag)"> 73c23a4279 2009-01-22 drh: db_prepare(&q, 73c23a4279 2009-01-22 drh: "SELECT tag.tagid, tagname FROM tagxref, tag" 73c23a4279 2009-01-22 drh: " WHERE tagxref.rid=%d AND tagtype>0 AND tagxref.tagid=tag.tagid" 73c23a4279 2009-01-22 drh: " ORDER BY CASE WHEN tagname GLOB 'sym-*' THEN substr(tagname,5)" 73c23a4279 2009-01-22 drh: " ELSE tagname END", 73c23a4279 2009-01-22 drh: rid 73c23a4279 2009-01-22 drh: ); 73c23a4279 2009-01-22 drh: while( db_step(&q)==SQLITE_ROW ){ 73c23a4279 2009-01-22 drh: int tagid = db_column_int(&q, 0); 73c23a4279 2009-01-22 drh: const char *zTagName = db_column_text(&q, 1); 73c23a4279 2009-01-22 drh: char zLabel[30]; 73c23a4279 2009-01-22 drh: sprintf(zLabel, "c%d", tagid); 73c23a4279 2009-01-22 drh: if( P(zLabel) ){ 73c23a4279 2009-01-22 drh: @ <br><input type="checkbox" name="c%d(tagid)" checked> 73c23a4279 2009-01-22 drh: }else{ 73c23a4279 2009-01-22 drh: @ <br><input type="checkbox" name="c%d(tagid)"> 73c23a4279 2009-01-22 drh: } 73c23a4279 2009-01-22 drh: if( strncmp(zTagName, "sym-", 4)==0 ){ 73c23a4279 2009-01-22 drh: @ Cancel tag <b>%h(&zTagName[4])</b> 73c23a4279 2009-01-22 drh: }else{ 73c23a4279 2009-01-22 drh: @ Cancel special tag <b>%h(zTagName)</b> f394d84560 2007-11-25 drh: } 73c23a4279 2009-01-22 drh: } f394d84560 2007-11-25 drh: db_finalize(&q); 42c2a18e73 2009-01-22 drh: @ </td></tr> 42c2a18e73 2009-01-22 drh: 42c2a18e73 2009-01-22 drh: if( db_exists("SELECT 1 FROM tagxref WHERE rid=%d AND tagid=%d AND srcid>0", 42c2a18e73 2009-01-22 drh: rid, TAG_BRANCH)==0 ){ 42c2a18e73 2009-01-22 drh: @ <tr><td align="right" valign="top"><b>Branching:</b></td> 42c2a18e73 2009-01-22 drh: @ <td valign="top"> 73c23a4279 2009-01-22 drh: @ <input type="checkbox" name="newbr"%s(zNewBrFlag)> 42c2a18e73 2009-01-22 drh: @ Make this check-in the start of a new branch named: 73c23a4279 2009-01-22 drh: @ <input type="text" width="15" name="brname" value="%h(zNewBranch)"> 42c2a18e73 2009-01-22 drh: @ </td></tr> 42c2a18e73 2009-01-22 drh: } 42c2a18e73 2009-01-22 drh: 73c23a4279 2009-01-22 drh: if( is_a_leaf(rid) 73c23a4279 2009-01-22 drh: && !db_exists("SELECT 1 FROM tagxref " 73c23a4279 2009-01-22 drh: " WHERE tagid=%d AND rid=%d AND tagtype>0", 73c23a4279 2009-01-22 drh: TAG_CLOSED, rid) 73c23a4279 2009-01-22 drh: ){ 42c2a18e73 2009-01-22 drh: @ <tr><td align="right" valign="top"><b>Leaf Closure:</b></td> 42c2a18e73 2009-01-22 drh: @ <td valign="top"> 73c23a4279 2009-01-22 drh: @ <input type="checkbox" name="close"%s(zCloseFlag)> 42c2a18e73 2009-01-22 drh: @ Mark this leaf as "closed" so that it no longer appears on the 42c2a18e73 2009-01-22 drh: @ "leaves" page and is no longer labeled as a "<b>Leaf</b>". 42c2a18e73 2009-01-22 drh: @ </td></tr> 42c2a18e73 2009-01-22 drh: } 42c2a18e73 2009-01-22 drh: b7f32a71ab 2009-01-20 drh: b7f32a71ab 2009-01-20 drh: @ <tr><td colspan="2"> f0474b87b0 2008-07-19 drh: @ <input type="submit" name="preview" value="Preview"> f0474b87b0 2008-07-19 drh: @ <input type="submit" name="apply" value="Apply Changes"> f0474b87b0 2008-07-19 drh: @ <input type="submit" name="cancel" value="Cancel"> b7f32a71ab 2009-01-20 drh: @ </td></tr> b7f32a71ab 2009-01-20 drh: @ </table> f0474b87b0 2008-07-19 drh: @ </form> 1a9c6dbfb7 2007-08-01 drh: style_footer(); 1a9c6dbfb7 2007-08-01 drh: }