File Annotation
Not logged in
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
3122fc4c7e 2008-02-14       drh: ** the current tree, or a particular artifact or baseline.
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;
dbda8d6ce9 2007-07-21       drh:   db_prepare(&q,
dbda8d6ce9 2007-07-21       drh:     "SELECT uuid"
dbda8d6ce9 2007-07-21       drh:     "  FROM blob WHERE rid=%d", rid
dbda8d6ce9 2007-07-21       drh:   );
dbda8d6ce9 2007-07-21       drh:   if( db_step(&q)==SQLITE_ROW ){
dbda8d6ce9 2007-07-21       drh:          /* 01234567890123 */
dbda8d6ce9 2007-07-21       drh:     printf("%-13s %s\n", zUuidName, db_column_text(&q, 0));
dbda8d6ce9 2007-07-21       drh:   }
dbda8d6ce9 2007-07-21       drh:   db_finalize(&q);
dbda8d6ce9 2007-07-21       drh:   db_prepare(&q, "SELECT uuid 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);
dbda8d6ce9 2007-07-21       drh:     printf("parent:       %s\n", zUuid);
dbda8d6ce9 2007-07-21       drh:   }
dbda8d6ce9 2007-07-21       drh:   db_finalize(&q);
dbda8d6ce9 2007-07-21       drh:   db_prepare(&q, "SELECT uuid 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);
dbda8d6ce9 2007-07-21       drh:     printf("child:        %s\n", zUuid);
dbda8d6ce9 2007-07-21       drh:   }
dbda8d6ce9 2007-07-21       drh:   db_finalize(&q);
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 ){
974f025c6e 2008-10-17       drh:     db_open_config();
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: /*
6458f020fc 2008-05-14       drh: ** Show information about descendants of a baseline.  Do this recursively
6458f020fc 2008-05-14       drh: ** to a depth of N.  Return true if descendants are shown and false if not.
6458f020fc 2008-05-14       drh: */
6458f020fc 2008-05-14       drh: static int showDescendants(int pid, int depth, const char *zTitle){
dbda8d6ce9 2007-07-21       drh:   Stmt q;
30d7afe328 2007-08-01       drh:   int cnt = 0;
dbda8d6ce9 2007-07-21       drh:   db_prepare(&q,
86c8768475 2007-08-01       drh:     "SELECT plink.cid, blob.uuid, datetime(plink.mtime, 'localtime'),"
3b5514ed82 2007-09-22       drh:     "       coalesce(event.euser,event.user),"
589687d783 2008-08-14       cle:     "       coalesce(event.ecomment,event.comment)"
30d7afe328 2007-08-01       drh:     "  FROM plink, blob, event"
30d7afe328 2007-08-01       drh:     " WHERE plink.pid=%d"
30d7afe328 2007-08-01       drh:     "   AND blob.rid=plink.cid"
30d7afe328 2007-08-01       drh:     "   AND event.objid=plink.cid"
30d7afe328 2007-08-01       drh:     " ORDER BY plink.mtime ASC",
30d7afe328 2007-08-01       drh:     pid
dbda8d6ce9 2007-07-21       drh:   );
30d7afe328 2007-08-01       drh:   while( db_step(&q)==SQLITE_ROW ){
30d7afe328 2007-08-01       drh:     int n;
30d7afe328 2007-08-01       drh:     int cid = db_column_int(&q, 0);
30d7afe328 2007-08-01       drh:     const char *zUuid = db_column_text(&q, 1);
30d7afe328 2007-08-01       drh:     const char *zDate = db_column_text(&q, 2);
30d7afe328 2007-08-01       drh:     const char *zUser = db_column_text(&q, 3);
30d7afe328 2007-08-01       drh:     const char *zCom = db_column_text(&q, 4);
30d7afe328 2007-08-01       drh:     cnt++;
30d7afe328 2007-08-01       drh:     if( cnt==1 ){
4ac16995e8 2007-08-19       drh:       if( zTitle ){
34af72801d 2007-11-23       drh:         @ <div class="section">%s(zTitle)</div>
4ac16995e8 2007-08-19       drh:       }
30d7afe328 2007-08-01       drh:       @ <ul>
30d7afe328 2007-08-01       drh:     }
30d7afe328 2007-08-01       drh:     @ <li>
30d7afe328 2007-08-01       drh:     hyperlink_to_uuid(zUuid);
2859293737 2007-11-22       drh:     @ %w(zCom) (by %s(zUser) on %s(zDate))
30d7afe328 2007-08-01       drh:     if( depth ){
6458f020fc 2008-05-14       drh:       n = showDescendants(cid, depth-1, 0);
30d7afe328 2007-08-01       drh:     }else{
30d7afe328 2007-08-01       drh:       n = db_int(0, "SELECT 1 FROM plink WHERE pid=%d", cid);
30d7afe328 2007-08-01       drh:     }
30d7afe328 2007-08-01       drh:     if( n==0 ){
4ac16995e8 2007-08-19       drh:       db_multi_exec("DELETE FROM leaves WHERE rid=%d", cid);
30d7afe328 2007-08-01       drh:       @ <b>leaf</b>
dbda8d6ce9 2007-07-21       drh:     }
dbda8d6ce9 2007-07-21       drh:   }
dbda8d6ce9 2007-07-21       drh:   db_finalize(&q);
30d7afe328 2007-08-01       drh:   if( cnt ){
30d7afe328 2007-08-01       drh:     @ </ul>
30d7afe328 2007-08-01       drh:   }
30d7afe328 2007-08-01       drh:   return cnt;
30d7afe328 2007-08-01       drh: }
30d7afe328 2007-08-01       drh: 
30d7afe328 2007-08-01       drh: /*
3122fc4c7e 2008-02-14       drh: ** Show information about ancestors of a baseline.  Do this recursively
30d7afe328 2007-08-01       drh: ** to a depth of N.  Return true if ancestors are shown and false if not.
30d7afe328 2007-08-01       drh: */
4ac16995e8 2007-08-19       drh: static void showAncestors(int pid, int depth, const char *zTitle){
30d7afe328 2007-08-01       drh:   Stmt q;
30d7afe328 2007-08-01       drh:   int cnt = 0;
30d7afe328 2007-08-01       drh:   db_prepare(&q,
86c8768475 2007-08-01       drh:     "SELECT plink.pid, blob.uuid, datetime(event.mtime, 'localtime'),"
3b5514ed82 2007-09-22       drh:     "       coalesce(event.euser,event.user),"
589687d783 2008-08-14       cle:     "       coalesce(event.ecomment,event.comment)"
30d7afe328 2007-08-01       drh:     "  FROM plink, blob, event"
30d7afe328 2007-08-01       drh:     " WHERE plink.cid=%d"
30d7afe328 2007-08-01       drh:     "   AND blob.rid=plink.pid"
30d7afe328 2007-08-01       drh:     "   AND event.objid=plink.pid"
30d7afe328 2007-08-01       drh:     " ORDER BY event.mtime DESC",
30d7afe328 2007-08-01       drh:     pid
30d7afe328 2007-08-01       drh:   );
dbda8d6ce9 2007-07-21       drh:   while( db_step(&q)==SQLITE_ROW ){
30d7afe328 2007-08-01       drh:     int cid = db_column_int(&q, 0);
30d7afe328 2007-08-01       drh:     const char *zUuid = db_column_text(&q, 1);
30d7afe328 2007-08-01       drh:     const char *zDate = db_column_text(&q, 2);
30d7afe328 2007-08-01       drh:     const char *zUser = db_column_text(&q, 3);
30d7afe328 2007-08-01       drh:     const char *zCom = db_column_text(&q, 4);
30d7afe328 2007-08-01       drh:     cnt++;
4ac16995e8 2007-08-19       drh:     if( cnt==1 ){
4ac16995e8 2007-08-19       drh:       if( zTitle ){
34af72801d 2007-11-23       drh:         @ <div class="section">%s(zTitle)</div>
dbda8d6ce9 2007-07-21       drh:       }
4ac16995e8 2007-08-19       drh:       @ <ul>
4ac16995e8 2007-08-19       drh:     }
30d7afe328 2007-08-01       drh:     @ <li>
30d7afe328 2007-08-01       drh:     hyperlink_to_uuid(zUuid);
2859293737 2007-11-22       drh:     @ %w(zCom) (by %s(zUser) on %s(zDate))
30d7afe328 2007-08-01       drh:     if( depth ){
4ac16995e8 2007-08-19       drh:       showAncestors(cid, depth-1, 0);
4ac16995e8 2007-08-19       drh:     }
4ac16995e8 2007-08-19       drh:   }
3b5514ed82 2007-09-22       drh:   db_finalize(&q);
4ac16995e8 2007-08-19       drh:   if( cnt ){
4ac16995e8 2007-08-19       drh:     @ </ul>
4ac16995e8 2007-08-19       drh:   }
4ac16995e8 2007-08-19       drh: }
4ac16995e8 2007-08-19       drh: 
4ac16995e8 2007-08-19       drh: 
4ac16995e8 2007-08-19       drh: /*
3122fc4c7e 2008-02-14       drh: ** Show information about baselines mentioned in the "leaves" table.
4ac16995e8 2007-08-19       drh: */
4ac16995e8 2007-08-19       drh: static void showLeaves(void){
30d7afe328 2007-08-01       drh:   Stmt q;
4ac16995e8 2007-08-19       drh:   int cnt = 0;
30d7afe328 2007-08-01       drh:   db_prepare(&q,
4ac16995e8 2007-08-19       drh:     "SELECT blob.uuid, datetime(event.mtime, 'localtime'),"
3b5514ed82 2007-09-22       drh:     "       coalesce(event.euser, event.user),"
3b5514ed82 2007-09-22       drh:     "       coalesce(event.ecomment,event.comment)"
72b3b1ad47 2007-09-22       drh:     "  FROM leaves, blob, event"
72b3b1ad47 2007-09-22       drh:     " WHERE blob.rid=leaves.rid"
abce5105e2 2007-09-01       drh:     "   AND event.objid=leaves.rid"
4ac16995e8 2007-08-19       drh:     " ORDER BY event.mtime DESC"
30d7afe328 2007-08-01       drh:   );
4ac16995e8 2007-08-19       drh:   while( db_step(&q)==SQLITE_ROW ){
4ac16995e8 2007-08-19       drh:     const char *zUuid = db_column_text(&q, 0);
4ac16995e8 2007-08-19       drh:     const char *zDate = db_column_text(&q, 1);
4ac16995e8 2007-08-19       drh:     const char *zUser = db_column_text(&q, 2);
4ac16995e8 2007-08-19       drh:     const char *zCom = db_column_text(&q, 3);
4ac16995e8 2007-08-19       drh:     cnt++;
4ac16995e8 2007-08-19       drh:     if( cnt==1 ){
34af72801d 2007-11-23       drh:       @ <div class="section">Leaves</div>
4ac16995e8 2007-08-19       drh:       @ <ul>
4ac16995e8 2007-08-19       drh:     }
4ac16995e8 2007-08-19       drh:     @ <li>
4ac16995e8 2007-08-19       drh:     hyperlink_to_uuid(zUuid);
2859293737 2007-11-22       drh:     @ %w(zCom) (by %s(zUser) on %s(zDate))
dbda8d6ce9 2007-07-21       drh:   }
dbda8d6ce9 2007-07-21       drh:   db_finalize(&q);
3b5514ed82 2007-09-22       drh:   if( cnt ){
3b5514ed82 2007-09-22       drh:     @ </ul>
3b5514ed82 2007-09-22       drh:   }
3b5514ed82 2007-09-22       drh: }
3b5514ed82 2007-09-22       drh: 
3b5514ed82 2007-09-22       drh: /*
3b5514ed82 2007-09-22       drh: ** Show information about all tags on a given node.
3b5514ed82 2007-09-22       drh: */
3122fc4c7e 2008-02-14       drh: static void showTags(int rid, const char *zNotGlob){
3b5514ed82 2007-09-22       drh:   Stmt q;
3b5514ed82 2007-09-22       drh:   int cnt = 0;
30d7afe328 2007-08-01       drh:   db_prepare(&q,
3b5514ed82 2007-09-22       drh:     "SELECT tag.tagid, tagname, srcid, blob.uuid, value,"
09c4adeb6f 2007-09-22       drh:     "       datetime(tagxref.mtime,'localtime'), tagtype"
3b5514ed82 2007-09-22       drh:     "  FROM tagxref JOIN tag ON tagxref.tagid=tag.tagid"
3b5514ed82 2007-09-22       drh:     "       LEFT JOIN blob ON blob.rid=tagxref.srcid"
3122fc4c7e 2008-02-14       drh:     " WHERE tagxref.rid=%d AND tagname NOT GLOB '%s'"
3122fc4c7e 2008-02-14       drh:     " ORDER BY tagname", rid, zNotGlob
30d7afe328 2007-08-01       drh:   );
dbda8d6ce9 2007-07-21       drh:   while( db_step(&q)==SQLITE_ROW ){
3b5514ed82 2007-09-22       drh:     const char *zTagname = db_column_text(&q, 1);
3b5514ed82 2007-09-22       drh:     int srcid = db_column_int(&q, 2);
3b5514ed82 2007-09-22       drh:     const char *zUuid = db_column_text(&q, 3);
3b5514ed82 2007-09-22       drh:     const char *zValue = db_column_text(&q, 4);
3b5514ed82 2007-09-22       drh:     const char *zDate = db_column_text(&q, 5);
09c4adeb6f 2007-09-22       drh:     int tagtype = db_column_int(&q, 6);
3b5514ed82 2007-09-22       drh:     cnt++;
3b5514ed82 2007-09-22       drh:     if( cnt==1 ){
34af72801d 2007-11-23       drh:       @ <div class="section">Tags And Properties</div>
3b5514ed82 2007-09-22       drh:       @ <ul>
3b5514ed82 2007-09-22       drh:     }
30d7afe328 2007-08-01       drh:     @ <li>
3b5514ed82 2007-09-22       drh:     @ <b>%h(zTagname)</b>
3b5514ed82 2007-09-22       drh:     if( zValue ){
3b5514ed82 2007-09-22       drh:       @ = %h(zValue)<i>
09c4adeb6f 2007-09-22       drh:     }else if( tagtype==0 ){
3b5514ed82 2007-09-22       drh:       @ <i>Cancelled
30d7afe328 2007-08-01       drh:     }else{
3b5514ed82 2007-09-22       drh:       @ <i>
3b5514ed82 2007-09-22       drh:     }
3b5514ed82 2007-09-22       drh:     if( srcid==0 ){
3b5514ed82 2007-09-22       drh:       @ Inherited
3b5514ed82 2007-09-22       drh:     }else if( zUuid ){
3b5514ed82 2007-09-22       drh:       @ From
3b5514ed82 2007-09-22       drh:       hyperlink_to_uuid(zUuid);
3b5514ed82 2007-09-22       drh:     }
3b5514ed82 2007-09-22       drh:     @ on %s(zDate)</i>
3b5514ed82 2007-09-22       drh:   }
3b5514ed82 2007-09-22       drh:   db_finalize(&q);
4ac16995e8 2007-08-19       drh:   if( cnt ){
4ac16995e8 2007-08-19       drh:     @ </ul>
4ac16995e8 2007-08-19       drh:   }
4ac16995e8 2007-08-19       drh: }
4ac16995e8 2007-08-19       drh: 
86c8768475 2007-08-01       drh: 
86c8768475 2007-08-01       drh: /*
86c8768475 2007-08-01       drh: ** WEBPAGE: vinfo
e8c4f69c50 2008-10-24       drh: ** URL:  /vinfo?name=RID|ARTIFACTID
3122fc4c7e 2008-02-14       drh: **
3122fc4c7e 2008-02-14       drh: ** Return information about a baseline
30d7afe328 2007-08-01       drh: */
30d7afe328 2007-08-01       drh: void vinfo_page(void){
30d7afe328 2007-08-01       drh:   Stmt q;
30d7afe328 2007-08-01       drh:   int rid;
86c8768475 2007-08-01       drh:   int isLeaf;
30d7afe328 2007-08-01       drh: 
30d7afe328 2007-08-01       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"));
30d7afe328 2007-08-01       drh:   if( rid==0 ){
f0474b87b0 2008-07-19       drh:     style_header("Baseline Information Error");
30d7afe328 2007-08-01       drh:     @ No such object: %h(g.argv[2])
30d7afe328 2007-08-01       drh:     style_footer();
30d7afe328 2007-08-01       drh:     return;
30d7afe328 2007-08-01       drh:   }
86c8768475 2007-08-01       drh:   isLeaf = !db_exists("SELECT 1 FROM plink WHERE pid=%d", rid);
30d7afe328 2007-08-01       drh:   db_prepare(&q,
86c8768475 2007-08-01       drh:      "SELECT uuid, datetime(mtime, 'localtime'), user, comment"
86c8768475 2007-08-01       drh:      "  FROM blob, event"
86c8768475 2007-08-01       drh:      " WHERE blob.rid=%d"
86c8768475 2007-08-01       drh:      "   AND event.objid=%d",
86c8768475 2007-08-01       drh:      rid, rid
30d7afe328 2007-08-01       drh:   );
30d7afe328 2007-08-01       drh:   if( db_step(&q)==SQLITE_ROW ){
dbda8d6ce9 2007-07-21       drh:     const char *zUuid = db_column_text(&q, 0);
3122fc4c7e 2008-02-14       drh:     char *zTitle = mprintf("Baseline [%.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;
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);
34af72801d 2007-11-23       drh:     @ <div class="section">Overview</div>
cfc7984ede 2007-09-25       jnc:     @ <p><table class="label-value">
f0474b87b0 2008-07-19       drh:     @ <tr><th>SHA1&nbsp;Hash:</th><td>%s(zUuid)</td></tr>
cfc7984ede 2007-09-25       jnc:     @ <tr><th>Date:</th><td>%s(db_column_text(&q, 1))</td></tr>
4ac16995e8 2007-08-19       drh:     if( g.okSetup ){
cfc7984ede 2007-09-25       jnc:       @ <tr><th>Record ID:</th><td>%d(rid)</td></tr>
cfc7984ede 2007-09-25       jnc:     }
f0474b87b0 2008-07-19       drh:     if( zEUser ){
f0474b87b0 2008-07-19       drh:       @ <tr><th>Edited&nbsp;User:</td><td>%h(zEUser)</td></tr>
f0474b87b0 2008-07-19       drh:       @ <tr><th>Original&nbsp;User:</th><td>%h(zUser)</td></tr>
f0474b87b0 2008-07-19       drh:     }else{
f0474b87b0 2008-07-19       drh:       @ <tr><th>User:</td><td>%h(zUser)</td></tr>
f0474b87b0 2008-07-19       drh:     }
f0474b87b0 2008-07-19       drh:     if( zEComment ){
f0474b87b0 2008-07-19       drh:       @ <tr><th>Edited&nbsp;Comment:</th><td>%w(zEComment)</td></tr>
f0474b87b0 2008-07-19       drh:       @ <tr><th>Original&nbsp;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>
2b0d4519dc 2008-05-05       drh:     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>
dbda8d6ce9 2007-07-21       drh:       @ </td></tr>
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)/vdiff/%d(rid)">diff</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 ){
f0474b87b0 2008-07-19       drh:         @     | <a href="%s(g.zBaseURL)/vedit?r=%d(rid)">edit</a>
dbda8d6ce9 2007-07-21       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{
3122fc4c7e 2008-02-14       drh:     style_header("Baseline Information");
2b0d4519dc 2008-05-05       drh:     login_anonymous_available();
86c8768475 2007-08-01       drh:   }
86c8768475 2007-08-01       drh:   db_finalize(&q);
3122fc4c7e 2008-02-14       drh:   showTags(rid, "");
9fd8009007 2008-11-09       drh:   @ <div class="section">File Changes</div>
86c8768475 2007-08-01       drh:   @ <ul>
86c8768475 2007-08-01       drh:   db_prepare(&q,
9fd8009007 2008-11-09       drh:      "SELECT a.name, b.name"
9fd8009007 2008-11-09       drh:      "  FROM mlink, filename AS a, filename AS b"
9fd8009007 2008-11-09       drh:      " WHERE mid=%d"
9fd8009007 2008-11-09       drh:      "   AND a.fnid=mlink.fnid"
9fd8009007 2008-11-09       drh:      "   AND b.fnid=mlink.pfnid",
9fd8009007 2008-11-09       drh:      rid
9fd8009007 2008-11-09       drh:   );
9fd8009007 2008-11-09       drh:   while( db_step(&q)==SQLITE_ROW ){
9fd8009007 2008-11-09       drh:     const char *zName = db_column_text(&q, 0);
9fd8009007 2008-11-09       drh:     const char *zPrior = db_column_text(&q, 1);
9fd8009007 2008-11-09       drh:     @ <li><b>Renamed:</b>
9fd8009007 2008-11-09       drh:     if( g.okHistory ){
9fd8009007 2008-11-09       drh:       @ <a href="%s(g.zBaseURL)/finfo?name=%T(zName)">%h(zPrior)</a> to
9fd8009007 2008-11-09       drh:       @ <a href="%s(g.zBaseURL)/finfo?name=%T(zName)">%h(zName)</a></li>
9fd8009007 2008-11-09       drh:     }else{
9fd8009007 2008-11-09       drh:       @ %h(zPrior) to %h(zName)</li>
9fd8009007 2008-11-09       drh:     }
9fd8009007 2008-11-09       drh:   }
9fd8009007 2008-11-09       drh:   db_finalize(&q);
9fd8009007 2008-11-09       drh:   db_prepare(&q,
9fd8009007 2008-11-09       drh:      "SELECT name, pid, fid "
86c8768475 2007-08-01       drh:      "  FROM mlink, filename"
86c8768475 2007-08-01       drh:      " WHERE mid=%d"
9fd8009007 2008-11-09       drh:      "   AND fid!=pid"
86c8768475 2007-08-01       drh:      "   AND filename.fnid=mlink.fnid",
86c8768475 2007-08-01       drh:      rid
86c8768475 2007-08-01       drh:   );
86c8768475 2007-08-01       drh:   while( db_step(&q)==SQLITE_ROW ){
86c8768475 2007-08-01       drh:     const char *zName = db_column_text(&q, 0);
86c8768475 2007-08-01       drh:     int pid = db_column_int(&q, 1);
86c8768475 2007-08-01       drh:     int fid = db_column_int(&q, 2);
86c8768475 2007-08-01       drh:     if( pid && fid ){
9fd8009007 2008-11-09       drh:       @ <li><b>Modified:</b>
86c8768475 2007-08-01       drh:     }else if( fid ){
9fd8009007 2008-11-09       drh:       @ <li><b>Added:</b>
9fd8009007 2008-11-09       drh:     }else if( pid ){
9fd8009007 2008-11-09       drh:       @ <li><b>Deleted:</b>
2b0d4519dc 2008-05-05       drh:     }
2b0d4519dc 2008-05-05       drh:     if( g.okHistory ){
2b0d4519dc 2008-05-05       drh:       @ <a href="%s(g.zBaseURL)/finfo?name=%T(zName)">%h(zName)</a></li>
86c8768475 2007-08-01       drh:     }else{
2b0d4519dc 2008-05-05       drh:       @ %h(zName)</li>
2b0d4519dc 2008-05-05       drh:     }
86c8768475 2007-08-01       drh:   }
86c8768475 2007-08-01       drh:   @ </ul>
4ac16995e8 2007-08-19       drh:   compute_leaves(rid);
6458f020fc 2008-05-14       drh:   showDescendants(rid, 2, "Descendants");
4ac16995e8 2007-08-19       drh:   showLeaves();
4ac16995e8 2007-08-19       drh:   showAncestors(rid, 2, "Ancestors");
4ac16995e8 2007-08-19       drh:   style_footer();
4ac16995e8 2007-08-19       drh: }
4ac16995e8 2007-08-19       drh: 
4ac16995e8 2007-08-19       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.
dfea940da8 2007-10-09       drh: */
dfea940da8 2007-10-09       drh: void winfo_page(void){
dfea940da8 2007-10-09       drh:   Stmt q;
dfea940da8 2007-10-09       drh:   int rid;
dfea940da8 2007-10-09       drh: 
dfea940da8 2007-10-09       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"));
dfea940da8 2007-10-09       drh:   if( rid==0 ){
dfea940da8 2007-10-09       drh:     style_header("Wiki Page Information Error");
dfea940da8 2007-10-09       drh:     @ No such object: %h(g.argv[2])
dfea940da8 2007-10-09       drh:     style_footer();
dfea940da8 2007-10-09       drh:     return;
dfea940da8 2007-10-09       drh:   }
dfea940da8 2007-10-09       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
dfea940da8 2007-10-09       drh:   );
dfea940da8 2007-10-09       drh:   if( db_step(&q)==SQLITE_ROW ){
dfea940da8 2007-10-09       drh:     const char *zName = db_column_text(&q, 0);
dfea940da8 2007-10-09       drh:     const char *zUuid = db_column_text(&q, 1);
dfea940da8 2007-10-09       drh:     char *zTitle = mprintf("Wiki Page %s", zName);
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>
dfea940da8 2007-10-09       drh:     @ <tr><th>Date:</th><td>%s(db_column_text(&q, 2))</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:     }
dfea940da8 2007-10-09       drh:     @ <tr><th>Original&nbsp;User:</th><td>%s(db_column_text(&q, 3))</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;
dfea940da8 2007-10-09       drh:   }
dfea940da8 2007-10-09       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,
1a9c6dbfb7 2007-08-01       drh:     "SELECT a.uuid, substr(b.uuid,1,10), datetime(event.mtime,'localtime'),"
3b5514ed82 2007-09-22       drh:     "       coalesce(event.ecomment, event.comment),"
3b5514ed82 2007-09-22       drh:     "       coalesce(event.euser, event.user),"
eae7ddfa4e 2008-02-04       drh:     "       mlink.pid, mlink.fid, mlink.mid, mlink.fnid"
1a9c6dbfb7 2007-08-01       drh:     "  FROM mlink, blob a, blob b, event"
86c8768475 2007-08-01       drh:     " WHERE mlink.fnid=(SELECT fnid FROM filename WHERE name=%Q)"
1a9c6dbfb7 2007-08-01       drh:     "   AND a.rid=mlink.mid"
1a9c6dbfb7 2007-08-01       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>
86c8768475 2007-08-01       drh:   while( db_step(&q)==SQLITE_ROW ){
1a9c6dbfb7 2007-08-01       drh:     const char *zVers = db_column_text(&q, 0);
1a9c6dbfb7 2007-08-01       drh:     const char *zUuid = db_column_text(&q, 1);
1a9c6dbfb7 2007-08-01       drh:     const char *zDate = db_column_text(&q, 2);
1a9c6dbfb7 2007-08-01       drh:     const char *zCom = db_column_text(&q, 3);
1a9c6dbfb7 2007-08-01       drh:     const char *zUser = db_column_text(&q, 4);
1a9c6dbfb7 2007-08-01       drh:     int fpid = db_column_int(&q, 5);
1a9c6dbfb7 2007-08-01       drh:     int frid = db_column_int(&q, 6);
eae7ddfa4e 2008-02-04       drh:     int mid = db_column_int(&q, 7);
eae7ddfa4e 2008-02-04       drh:     int fnid = db_column_int(&q, 8);
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>
86c8768475 2007-08-01       drh:       @ <table cellpadding=2 border=0>
86c8768475 2007-08-01       drh:       @ <tr><td bgcolor="#a0b5f4" class="border1">
86c8768475 2007-08-01       drh:       @ <table cellpadding=2 cellspacing=0 border=0><tr>
86c8768475 2007-08-01       drh:       @ <td bgcolor="#d0d9f4" class="bkgnd1">%s(zPrevDate)</td>
86c8768475 2007-08-01       drh:       @ </tr></table>
86c8768475 2007-08-01       drh:       @ </td></tr></table>
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">
1a9c6dbfb7 2007-08-01       drh:     hyperlink_to_uuid(zVers);
1a9c6dbfb7 2007-08-01       drh:     @ %h(zCom) (By: %h(zUser))
1a9c6dbfb7 2007-08-01       drh:     @ Id: %s(zUuid)/%d(frid)
2b0d4519dc 2008-05-05       drh:     if( g.okHistory ){
2b0d4519dc 2008-05-05       drh:       @ <a href="%s(g.zBaseURL)/artifact/%d(frid)">[view]</a>
2b0d4519dc 2008-05-05       drh:       if( fpid ){
2b0d4519dc 2008-05-05       drh:         @ <a href="%s(g.zBaseURL)/fdiff?v1=%d(fpid)&amp;v2=%d(frid)">[diff]</a>
2b0d4519dc 2008-05-05       drh:       }
2b0d4519dc 2008-05-05       drh:       @ <a href="%s(g.zBaseURL)/annotate?mid=%d(mid)&amp;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: ** Append the difference between two RIDs to the output
9df32e2808 2007-08-01       drh: */
9df32e2808 2007-08-01       drh: static void append_diff(int fromid, int toid){
9df32e2808 2007-08-01       drh:   Blob from, to, out;
9df32e2808 2007-08-01       drh:   content_get(fromid, &from);
9df32e2808 2007-08-01       drh:   content_get(toid, &to);
9df32e2808 2007-08-01       drh:   blob_zero(&out);
57b2735ebd 2007-11-15       drh:   text_diff(&from, &to, &out, 5);
9df32e2808 2007-08-01       drh:   @ %h(blob_str(&out))
9df32e2808 2007-08-01       drh:   blob_reset(&from);
9df32e2808 2007-08-01       drh:   blob_reset(&to);
9df32e2808 2007-08-01       drh:   blob_reset(&out);
9df32e2808 2007-08-01       drh: }
9df32e2808 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; }
33c31f73cd 2008-02-21       drh:   style_header("Baseline Changes");
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();
9df32e2808 2007-08-01       drh:   }
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:   zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid);
33c31f73cd 2008-02-21       drh:   @ <h2>All Changes In Baseline
9df32e2808 2007-08-01       drh:   hyperlink_to_uuid(zUuid);
9df32e2808 2007-08-01       drh:   @ </h2>
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);
677aa71bca 2007-10-12       drh:     @ <p><a href="%s(g.zBaseURL)/finfo?name=%T(zName)">%h(zName)</a></p>
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);
9df32e2808 2007-08-01       drh:   style_footer();
9df32e2808 2007-08-01       drh: }
9df32e2808 2007-08-01       drh: 
9df32e2808 2007-08-01       drh: 
1a9c6dbfb7 2007-08-01       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: **
1a9c6dbfb7 2007-08-01       drh: **     * It's uuid
1a9c6dbfb7 2007-08-01       drh: **     * All its filenames
3122fc4c7e 2008-02-14       drh: **     * The baselines it was checked-in on, 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: **
1a9c6dbfb7 2007-08-01       drh: **     * It's uuid
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 */
389bf5c4da 2008-11-17       drh:   int linkToView           /* Add viewer link if true */
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,
1a9c6dbfb7 2007-08-01       drh:     "SELECT filename.name, datetime(event.mtime), substr(a.uuid,1,10),"
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);
1a9c6dbfb7 2007-08-01       drh:     const char *zFuuid = db_column_text(&q, 2);
1a9c6dbfb7 2007-08-01       drh:     const char *zCom = db_column_text(&q, 3);
1a9c6dbfb7 2007-08-01       drh:     const char *zUser = db_column_text(&q, 4);
1a9c6dbfb7 2007-08-01       drh:     const char *zVers = db_column_text(&q, 5);
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:     }
5452b32a9f 2008-11-17       drh:     @ <a href="%s(g.zBaseURL)/finfo?name=%T(zName)">%h(zName)</a>
1a9c6dbfb7 2007-08-01       drh:     @ uuid %s(zFuuid) part of check-in
1a9c6dbfb7 2007-08-01       drh:     hyperlink_to_uuid(zVers);
5452b32a9f 2008-11-17       drh:     @ %w(zCom) by %h(zUser) on %s(zDate).
1a9c6dbfb7 2007-08-01       drh:     cnt++;
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),"
dfea940da8 2007-10-09       drh:     "       coalesce(event.euser, event.user), uuid"
dfea940da8 2007-10-09       drh:     "  FROM tagxref, tag, event, blob"
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 event.objid=tagxref.rid"
dfea940da8 2007-10-09       drh:     "   AND blob.rid=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);
1a9c6dbfb7 2007-08-01       drh:     const char *zUuid = db_column_text(&q, 3);
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:     }
a48474bc75 2008-05-29       drh:     @ [<a href="%s(g.zBaseURL)/wiki?name=%t(zPagename)">%h(zPagename)</a>]
5452b32a9f 2008-11-17       drh:     @ uuid %s(zUuid) by %h(zUser) on %s(zDate).
dfea940da8 2007-10-09       drh:     nWiki++;
1a9c6dbfb7 2007-08-01       drh:     cnt++;
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,
3122fc4c7e 2008-02-14       drh:       "SELECT datetime(mtime), user, comment, uuid, type"
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);
dfea940da8 2007-10-09       drh:       const char *zUuid = db_column_text(&q, 3);
dfea940da8 2007-10-09       drh:       const char *zUser = db_column_text(&q, 1);
2859293737 2007-11-22       drh:       const char *zCom = db_column_text(&q, 2);
3122fc4c7e 2008-02-14       drh:       const char *zType = 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' ){
3122fc4c7e 2008-02-14       drh:         @ Manifest of baseline
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);
5452b32a9f 2008-11-17       drh:       @ %w(zCom) by %h(zUser) on %s(zDate).
dfea940da8 2007-10-09       drh:       cnt++;
dfea940da8 2007-10-09       drh:     }
dbda8d6ce9 2007-07-21       drh:     db_finalize(&q);
dbda8d6ce9 2007-07-21       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);
72b3b1ad47 2007-09-22       drh:     @ Control file %s(zUuid).
1a9c6dbfb7 2007-08-01       drh:   }else if( linkToView ){
3122fc4c7e 2008-02-14       drh:     @ <a href="%s(g.zBaseURL)/artifact/%d(rid)">[view]</a>
1a9c6dbfb7 2007-08-01       drh:   }
dbda8d6ce9 2007-07-21       drh: }
dbda8d6ce9 2007-07-21       drh: 
dbda8d6ce9 2007-07-21       drh: /*
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>
1a9c6dbfb7 2007-08-01       drh:   object_description(v1, 1);
1a9c6dbfb7 2007-08-01       drh:   @ </blockquote>
1a9c6dbfb7 2007-08-01       drh:   @ <h2>To:</h2>
1a9c6dbfb7 2007-08-01       drh:   @ <blockquote>
1a9c6dbfb7 2007-08-01       drh:   object_description(v2, 1);
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
f394d84560 2007-11-25       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.
f394d84560 2007-11-25       drh: */
389bf5c4da 2008-11-17       drh: void rawartifact_page(void){
f394d84560 2007-11-25       drh:   int rid;
389bf5c4da 2008-11-17       drh:   const char *zMime;
f394d84560 2007-11-25       drh:   Blob content;
f394d84560 2007-11-25       drh: 
f394d84560 2007-11-25       drh:   rid = name_to_rid(PD("name","0"));
389bf5c4da 2008-11-17       drh:   zMime = PD("m","application/x-fossil-artifact");
f394d84560 2007-11-25       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"); }
f394d84560 2007-11-25       drh:   content_get(rid, &content);
389bf5c4da 2008-11-17       drh:   cgi_set_content_type(zMime);
389bf5c4da 2008-11-17       drh:   cgi_set_content(&content);
f394d84560 2007-11-25       drh: }
f394d84560 2007-11-25       drh: 
f394d84560 2007-11-25       drh: /*
7303bfeb12 2008-11-17       drh: ** Render a hex dump of a file.
f394d84560 2007-11-25       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:         }
f394d84560 2007-11-25       drh:       }else{
7303bfeb12 2008-11-17       drh:         zLine[k] = 0;
f394d84560 2007-11-25       drh:       }
f394d84560 2007-11-25       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
7303bfeb12 2008-11-17       drh: **
7303bfeb12 2008-11-17       drh: ** Show the complete content of a file identified by ARTIFACTID
7303bfeb12 2008-11-17       drh: ** as preformatted text.
7303bfeb12 2008-11-17       drh: */
7303bfeb12 2008-11-17       drh: void hexdump_page(void){
7303bfeb12 2008-11-17       drh:   int rid;
7303bfeb12 2008-11-17       drh:   Blob content;
7303bfeb12 2008-11-17       drh: 
7303bfeb12 2008-11-17       drh:   rid = name_to_rid(PD("name","0"));
7303bfeb12 2008-11-17       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:     }
7351b6346d 2008-05-15       drh:   }
7303bfeb12 2008-11-17       drh:   style_header("Hex Artifact Content");
7303bfeb12 2008-11-17       drh:   @ <h2>Hexadecimal Content Of:</h2>
7303bfeb12 2008-11-17       drh:   @ <blockquote>
7303bfeb12 2008-11-17       drh:   object_description(rid, 0);
7303bfeb12 2008-11-17       drh:   @ </blockquote>
7303bfeb12 2008-11-17       drh:   @ <hr>
7303bfeb12 2008-11-17       drh:   content_get(rid, &content);
7303bfeb12 2008-11-17       drh:   @ <blockquote><pre>
7303bfeb12 2008-11-17       drh:   hexdump(&content);
7303bfeb12 2008-11-17       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
1a9c6dbfb7 2007-08-01       drh: **
e8c4f69c50 2008-10-24       drh: ** Show the complete content of a file identified by ARTIFACTID
b2e55c0d4d 2007-09-01       drh: ** as preformatted text.
1a9c6dbfb7 2007-08-01       drh: */
3122fc4c7e 2008-02-14       drh: void artifact_page(void){
1a9c6dbfb7 2007-08-01       drh:   int rid;
1a9c6dbfb7 2007-08-01       drh:   Blob content;
389bf5c4da 2008-11-17       drh:   const char *zMime;
dbda8d6ce9 2007-07-21       drh: 
677aa71bca 2007-10-12       drh:   rid = name_to_rid(PD("name","0"));
1a9c6dbfb7 2007-08-01       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);
a48474bc75 2008-05-29       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);
dfea940da8 2007-10-09       drh:     }
dbda8d6ce9 2007-07-21       drh:   }
3122fc4c7e 2008-02-14       drh:   style_header("Artifact Content");
1a9c6dbfb7 2007-08-01       drh:   @ <h2>Content Of:</h2>
1a9c6dbfb7 2007-08-01       drh:   @ <blockquote>
1a9c6dbfb7 2007-08-01       drh:   object_description(rid, 0);
1a9c6dbfb7 2007-08-01       drh:   @ </blockquote>
1a9c6dbfb7 2007-08-01       drh:   @ <hr>
7303bfeb12 2008-11-17       drh:   @ <blockquote>
b3ee50c946 2008-07-15       drh:   content_get(rid, &content);
7303bfeb12 2008-11-17       drh:   zMime = mimetype_from_content(&content);
7303bfeb12 2008-11-17       drh:   if( zMime==0 ){
dbda8d6ce9 2007-07-21       drh:     @ <pre>
389bf5c4da 2008-11-17       drh:     @ %h(blob_str(&content))
dbda8d6ce9 2007-07-21       drh:     @ </pre>
7303bfeb12 2008-11-17       drh:     style_submenu_element("Hex","Hex", "%s/hexdump?name=%d", g.zTop, rid);
7303bfeb12 2008-11-17       drh:   }else if( strncmp(zMime, "image/", 6)==0 ){
7303bfeb12 2008-11-17       drh:     @ <img src="%s(g.zBaseURL)/raw?name=%d(rid)&m=%s(zMime)"></img>
7303bfeb12 2008-11-17       drh:     style_submenu_element("Hex","Hex", "%s/hexdump?name=%d", g.zTop, rid);
dbda8d6ce9 2007-07-21       drh:   }else{
dbda8d6ce9 2007-07-21       drh:     @ <pre>
7303bfeb12 2008-11-17       drh:     hexdump(&content);
dbda8d6ce9 2007-07-21       drh:     @ </pre>
f394d84560 2007-11-25       drh:   }
7303bfeb12 2008-11-17       drh:   @ </blockquote>
c8a78004ce 2008-10-20       drh:   style_footer();
b3ee50c946 2008-07-15       drh: }
7351b6346d 2008-05-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;
7351b6346d 2008-05-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);
f394d84560 2007-11-25       drh:     }
b3ee50c946 2008-07-15       drh:   }
1a9c6dbfb7 2007-08-01       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();
dbda8d6ce9 2007-07-21       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;
b3ee50c946 2008-07-15       drh:   @ <h2>Changes to ticket <a href="%s(m.zTicketUuid)">%s(zTktName)</a></h2>
b3ee50c946 2008-07-15       drh:   @
b3ee50c946 2008-07-15       drh:   @ <p>By %h(m.zUser) on %s(zDate).  See also:
b3ee50c946 2008-07-15       drh:   @ <a href="%s(g.zTop)/artifact/%T(zUuid)">artifact content</a>, and
b3ee50c946 2008-07-15       drh:   @ <a href="%s(g.zTop)/tkthistory/%s(m.zTicketUuid)">ticket history</a>
b3ee50c946 2008-07-15       drh:   @ </p>
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();
3122fc4c7e 2008-02-14       drh: }
b3ee50c946 2008-07-15       drh: 
3122fc4c7e 2008-02-14       drh: 
3122fc4c7e 2008-02-14       drh: /*
3122fc4c7e 2008-02-14       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.
3122fc4c7e 2008-02-14       drh: **
e8c4f69c50 2008-10-24       drh: ** Figure out what the artifact ID is and jump to it.
3122fc4c7e 2008-02-14       drh: */
3122fc4c7e 2008-02-14       drh: void info_page(void){
3122fc4c7e 2008-02-14       drh:   const char *zName;
3984b1b2c1 2008-08-04      eric:   Blob uuid;
3122fc4c7e 2008-02-14       drh:   int rid, nName;
3122fc4c7e 2008-02-14       drh: 
3122fc4c7e 2008-02-14       drh:   zName = P("name");
68c24b1857 2008-05-16       drh:   if( zName==0 ) fossil_redirect_home();
3122fc4c7e 2008-02-14       drh:   nName = strlen(zName);
3122fc4c7e 2008-02-14       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:         tagview_page();
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:     }
7351b6346d 2008-05-15       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;
3122fc4c7e 2008-02-14       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 ){
3122fc4c7e 2008-02-14       drh:     style_header("Broken Link");
3122fc4c7e 2008-02-14       drh:     @ <p>No such object: %h(zName)</p>
3122fc4c7e 2008-02-14       drh:     style_footer();
3122fc4c7e 2008-02-14       drh:     return;
3122fc4c7e 2008-02-14       drh:   }
3122fc4c7e 2008-02-14       drh:   if( db_exists("SELECT 1 FROM mlink WHERE mid=%d", rid) ){
3122fc4c7e 2008-02-14       drh:     vinfo_page();
3122fc4c7e 2008-02-14       drh:   }else
3122fc4c7e 2008-02-14       drh:   if( db_exists("SELECT 1 FROM mlink WHERE fid=%d", rid) ){
3122fc4c7e 2008-02-14       drh:     finfo_page();
3122fc4c7e 2008-02-14       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
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: /*
f0474b87b0 2008-07-19       drh: ** WEBPAGE: vedit
f0474b87b0 2008-07-19       drh: ** URL:  vedit?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: */
f0474b87b0 2008-07-19       drh: void vedit_page(void){
f0474b87b0 2008-07-19       drh:   int rid;
f0474b87b0 2008-07-19       drh:   const char *zComment;
f0474b87b0 2008-07-19       drh:   const char *zNewComment;
f0474b87b0 2008-07-19       drh:   const char *zUser;
f0474b87b0 2008-07-19       drh:   const char *zNewUser;
f0474b87b0 2008-07-19       drh:   char *zUuid;
f0474b87b0 2008-07-19       drh:   Blob comment;
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"));
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();
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);
f0474b87b0 2008-07-19       drh:   zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid);
f0474b87b0 2008-07-19       drh:   if( P("cancel") ){
f0474b87b0 2008-07-19       drh:     cgi_redirectf("vinfo?name=%d", rid);
f0474b87b0 2008-07-19       drh:   }
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);
f0474b87b0 2008-07-19       drh:     if( strcmp(zComment,zNewComment)!=0 ){
f0474b87b0 2008-07-19       drh:       nChng++;
f0474b87b0 2008-07-19       drh:       blob_appendf(&ctrl, "T +comment %s %F\n", zUuid, zNewComment);
f0474b87b0 2008-07-19       drh:     }
f0474b87b0 2008-07-19       drh:     if( strcmp(zUser,zNewUser)!=0 ){
f0474b87b0 2008-07-19       drh:       nChng++;
f0474b87b0 2008-07-19       drh:       blob_appendf(&ctrl, "T +user %s %F\n", zUuid, zNewUser);
f0474b87b0 2008-07-19       drh:     }
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();
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:     }
f0474b87b0 2008-07-19       drh:     cgi_redirectf("vinfo?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;
f0474b87b0 2008-07-19       drh:   style_header("Edit Baseline [%s]", zUuid);
f0474b87b0 2008-07-19       drh:   @ <p>Make changes to the User and Comment for baseline
f0474b87b0 2008-07-19       drh:   @ [<a href="vinfo?name=%d(rid)">%s(zUuid)</a>] then press the
f0474b87b0 2008-07-19       drh:   @ "Apply Changes" button.</p>
f0474b87b0 2008-07-19       drh:   @ <form action="%s(g.zBaseURL)/vedit" method="POST">
0be54823ba 2008-10-18       drh:   login_insert_csrf_secret();
f0474b87b0 2008-07-19       drh:   @ <input type="hidden" name="r" value="%d(rid)">
f0474b87b0 2008-07-19       drh:   @ <p>
f0474b87b0 2008-07-19       drh:   @ <b>User:</b> <input type="text" name="u" size="20" value="%h(zNewUser)">
f0474b87b0 2008-07-19       drh:   @ </p>
f0474b87b0 2008-07-19       drh:   @ <p><b>Comment:</b></b><br />
f0474b87b0 2008-07-19       drh:   wiki_convert(&comment, 0, WIKI_INLINE);
f0474b87b0 2008-07-19       drh:   @ <br /><textarea name="c" rows="10" cols="80">%h(zNewComment)</textarea></p>
f0474b87b0 2008-07-19       drh:   @ <blockquote>
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">
f0474b87b0 2008-07-19       drh:   @ </blockquote>
f0474b87b0 2008-07-19       drh:   @ </form>
1a9c6dbfb7 2007-08-01       drh:   style_footer();
1a9c6dbfb7 2007-08-01       drh: }