Index: src/info.c ================================================================== --- src/info.c +++ src/info.c @@ -602,10 +602,117 @@ www_print_timeline(&q, TIMELINE_DISJOINT|TIMELINE_GRAPH|TIMELINE_NOSCROLL, 0, 0, 0, rid, 0, 0); db_finalize(&q); style_finish_page(); } + +/* +** WEBPAGE: ckout +** +** Show information about the current checkout. This page only functions +** if the web server is run on a loopback interface (in other words, was +** started using "fossil ui" or similar) from with on open check-out. +*/ +void ckout_page(void){ + const char *zName = P("name"); + int vid; + char *zHostname; + char *zCwd; + int diffType; /* 0: no diff, 1: unified, 2: side-by-side */ + DiffConfig DCfg,*pCfg; /* Diff details */ + Stmt q; + + if( zName || !db_open_local(0) || !cgi_is_loopback(g.zIpAddr) ){ + webpage_notfound_error(0 /*works-like:""*/); + return; + } + diffType = preferred_diff_type(); + pCfg = construct_diff_flags(diffType, &DCfg); + vid = db_lget_int("checkout", 0); + vfile_check_signature(vid, CKSIG_ENOTFILE); + style_set_current_feature("vinfo"); + zHostname = fossil_hostname(); + zCwd = file_getcwd(0,0); + if( zHostname ){ + style_header("Checkout at %s:%s", zHostname, zCwd); + }else{ + style_header("Checkout at %s", zCwd); + } + render_checkin_context(vid, 0, 0, 0); + db_prepare(&q, + /* 0 1 2 3 4 5 6 */ + "SELECT pathname, deleted, chnged , rid==0, rid, islink, uuid" + " FROM vfile LEFT JOIN blob USING(rid)" + " WHERE vid=%d" + " AND (deleted OR chnged OR rid==0)" + " ORDER BY pathname /*scan*/", + vid + ); + if( pCfg->diffFlags & DIFF_SIDEBYSIDE ){ + pCfg->diffFlags |= DIFF_HTML | DIFF_NOTTOOBIG; + }else{ + pCfg->diffFlags |= DIFF_LINENO | DIFF_HTML | DIFF_NOTTOOBIG; + } + while( db_step(&q)==SQLITE_ROW ){ + const char *zTreename = db_column_text(&q,0); + int isDeleted = db_column_int(&q, 1); + int isChnged = db_column_int(&q,2); + int isNew = db_column_int(&q,3); + int srcid = db_column_int(&q, 4); + int isLink = db_column_int(&q, 5); + const char *zUuid = db_column_text(&q, 6); + int showDiff = 1; + + pCfg->diffFlags &= (~DIFF_FILE_MASK); + if( isDeleted ){ + @
DELETED %h(zTreename)
+ pCfg->diffFlags |= DIFF_FILE_DELETED; + showDiff = 0; + }else if( file_access(zTreename, F_OK) ){ + @MISSING %h(zTreename)
+ showDiff = 0; + }else if( isNew ){ + @ADDED %h(zTreename)
+ pCfg->diffFlags |= DIFF_FILE_ADDED; + srcid = 0; + showDiff = 0; + }else if( isChnged==3 ){ + @ADDED_BY_MERGE %h(zTreename)
+ pCfg->diffFlags |= DIFF_FILE_ADDED; + srcid = 0; + showDiff = 0; + }else if( isChnged==5 ){ + @ADDED_BY_INTEGRATE %h(zTreename)
+ pCfg->diffFlags |= DIFF_FILE_ADDED; + srcid = 0; + showDiff = 0; + }else{ + @CHANGED %h(zTreename)
+ } + if( showDiff ){ + Blob old, new; + if( !isLink != !file_islink(zTreename) ){ + @ %s(DIFF_CANNOT_COMPUTE_SYMLINK) + continue; + } + if( srcid>0 ){ + content_get(srcid, &old); + pCfg->zLeftHash = zUuid; + }else{ + blob_zero(&old); + pCfg->zLeftHash = 0; + } + blob_read_from_file(&new, zTreename, ExtFILE); + text_diff(&old, &new, cgi_output_blob(), pCfg); + blob_reset(&old); + blob_reset(&new); + } + } + db_finalize(&q); + append_diff_javascript(diffType); + style_finish_page(); +} /* ** WEBPAGE: vinfo ** WEBPAGE: ci ** URL: /ci/ARTIFACTID