cSvn-UI for SVN Repositories

cGit-UI – is a web interface for Subversion (SVN) Repositories. cSvn CGI script is writen in C and therefore it's fast enough

6 Commits   0 Branches   2 Tags
bfc1508d (kx 2023-03-24 03:55:33 +0300   1) 
bfc1508d (kx 2023-03-24 03:55:33 +0300   2) #ifdef HAVE_CONFIG_H
bfc1508d (kx 2023-03-24 03:55:33 +0300   3) #include <config.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300   4) #endif
bfc1508d (kx 2023-03-24 03:55:33 +0300   5) 
bfc1508d (kx 2023-03-24 03:55:33 +0300   6) #include <stdlib.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300   7) #include <stdio.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300   8) #include <sys/sysinfo.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300   9) #include <sys/types.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  10) #ifdef HAVE_INTTYPES_H
bfc1508d (kx 2023-03-24 03:55:33 +0300  11) #include <inttypes.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  12) #else
bfc1508d (kx 2023-03-24 03:55:33 +0300  13) #include <stdint.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  14) #endif
bfc1508d (kx 2023-03-24 03:55:33 +0300  15) #include <stddef.h>   /* offsetof(3) */
bfc1508d (kx 2023-03-24 03:55:33 +0300  16) #include <dirent.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  17) #include <sys/stat.h> /* chmod(2)    */
bfc1508d (kx 2023-03-24 03:55:33 +0300  18) #include <sys/file.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  19) #include <sys/mman.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  20) #include <fcntl.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  21) #include <limits.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  22) #include <string.h>   /* strdup(3)   */
bfc1508d (kx 2023-03-24 03:55:33 +0300  23) #include <libgen.h>   /* basename(3) */
bfc1508d (kx 2023-03-24 03:55:33 +0300  24) #include <ctype.h>    /* tolower(3)  */
bfc1508d (kx 2023-03-24 03:55:33 +0300  25) #include <errno.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  26) #include <time.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  27) #include <sys/time.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  28) #include <pwd.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  29) #include <grp.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  30) #include <stdarg.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  31) #include <locale.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  32) #include <unistd.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  33) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  34) #define _GNU_SOURCE
bfc1508d (kx 2023-03-24 03:55:33 +0300  35) #include <getopt.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  36) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  37) #include <nls.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  38) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  39) #include <defs.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  40) #include <cscm/bcf.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  41) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  42) #include <fatal.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  43) #include <http.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  44) #include <html.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  45) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  46) #include <dlist.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  47) #include <strbuf.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  48) #include <repolist.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  49) #include <wrapper.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  50) #include <system.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  51) #include <date.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  52) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  53) #include <ctx.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  54) #include <ui-shared.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  55) #include <ui-repolist.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  56) #include <ui-file.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  57) #include <ui-tree.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  58) #include <ui-diff.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  59) #include <ui-blame.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  60) #include <ui-log.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300  61) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  62) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  63) static void free_resources( void )
bfc1508d (kx 2023-03-24 03:55:33 +0300  64) {
bfc1508d (kx 2023-03-24 03:55:33 +0300  65)   if( config ) free_config();
bfc1508d (kx 2023-03-24 03:55:33 +0300  66) }
bfc1508d (kx 2023-03-24 03:55:33 +0300  67) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  68) int main( int argc, char *argv[] )
bfc1508d (kx 2023-03-24 03:55:33 +0300  69) {
bfc1508d (kx 2023-03-24 03:55:33 +0300  70) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  71)   __mctx_init();
bfc1508d (kx 2023-03-24 03:55:33 +0300  72) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  73)   setlocale( LC_ALL, "" );
bfc1508d (kx 2023-03-24 03:55:33 +0300  74) #if ENABLE_NLS == 1
bfc1508d (kx 2023-03-24 03:55:33 +0300  75)   bindtextdomain( PACKAGE, LOCALEDIR );
bfc1508d (kx 2023-03-24 03:55:33 +0300  76)   textdomain( PACKAGE );
bfc1508d (kx 2023-03-24 03:55:33 +0300  77) #endif
bfc1508d (kx 2023-03-24 03:55:33 +0300  78) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  79)   csvn_prepare_context();
bfc1508d (kx 2023-03-24 03:55:33 +0300  80) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  81)   /************************
bfc1508d (kx 2023-03-24 03:55:33 +0300  82)     define error handlers:
bfc1508d (kx 2023-03-24 03:55:33 +0300  83)    */
bfc1508d (kx 2023-03-24 03:55:33 +0300  84)    system_fatal = fatal_html;
bfc1508d (kx 2023-03-24 03:55:33 +0300  85)   wrapper_fatal = fatal_html;
bfc1508d (kx 2023-03-24 03:55:33 +0300  86)     dlist_fatal = fatal_html;
bfc1508d (kx 2023-03-24 03:55:33 +0300  87)     rlist_fatal = fatal_html;
bfc1508d (kx 2023-03-24 03:55:33 +0300  88)      http_fatal = fatal_html;
bfc1508d (kx 2023-03-24 03:55:33 +0300  89)      html_fatal = fatal_html;
bfc1508d (kx 2023-03-24 03:55:33 +0300  90) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  91)   if( !(config = read_config()) )
bfc1508d (kx 2023-03-24 03:55:33 +0300  92)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  93)     fatal_html( "cannot read config file: /dev/shm%s", CSVN_SHM_BCF );
bfc1508d (kx 2023-03-24 03:55:33 +0300  94)     free_resources();
bfc1508d (kx 2023-03-24 03:55:33 +0300  95)     exit( 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  96)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  97) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  98)   csvn_parse_query();
bfc1508d (kx 2023-03-24 03:55:33 +0300  99) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 100)   csvn_prepare_template_variables();
bfc1508d (kx 2023-03-24 03:55:33 +0300 101) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 102)   if( ctx.page.status == 404 )
bfc1508d (kx 2023-03-24 03:55:33 +0300 103)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300 104)     csvn_print_404_page();
bfc1508d (kx 2023-03-24 03:55:33 +0300 105)     csvn_release_template_variables();
bfc1508d (kx 2023-03-24 03:55:33 +0300 106)     free_resources();
bfc1508d (kx 2023-03-24 03:55:33 +0300 107)     return 0;
bfc1508d (kx 2023-03-24 03:55:33 +0300 108)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300 109) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 110)   if( !strcmp( ctx.vars.page_type, ptype_repolist ) )
bfc1508d (kx 2023-03-24 03:55:33 +0300 111)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300 112)     if( ctx.query.search && *ctx.query.search )
bfc1508d (kx 2023-03-24 03:55:33 +0300 113)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300 114)       csvn_search_repo( ctx.query.search );
bfc1508d (kx 2023-03-24 03:55:33 +0300 115)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300 116)     csvn_print_repolist_page();
bfc1508d (kx 2023-03-24 03:55:33 +0300 117)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300 118)   else if( !strcmp( ctx.vars.page_type, ptype_repo ) )
bfc1508d (kx 2023-03-24 03:55:33 +0300 119)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300 120)     if( ctx.query.operation && *ctx.query.operation && !strcmp( ctx.query.operation, "diff" ) )
bfc1508d (kx 2023-03-24 03:55:33 +0300 121)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300 122)       csvn_print_diff_page();
bfc1508d (kx 2023-03-24 03:55:33 +0300 123)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300 124)     else if( ctx.query.operation && *ctx.query.operation && !strcmp( ctx.query.operation, "log" ) )
bfc1508d (kx 2023-03-24 03:55:33 +0300 125)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300 126)       csvn_print_log_page();
bfc1508d (kx 2023-03-24 03:55:33 +0300 127)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300 128)     else if( ctx.repo.relative_info.kind == KIND_FILE )
bfc1508d (kx 2023-03-24 03:55:33 +0300 129)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300 130)       if( ctx.query.operation && *ctx.query.operation && !strcmp( ctx.query.operation, "blame" ) )
bfc1508d (kx 2023-03-24 03:55:33 +0300 131)       {
bfc1508d (kx 2023-03-24 03:55:33 +0300 132)         csvn_print_blame_page();
bfc1508d (kx 2023-03-24 03:55:33 +0300 133)       }
bfc1508d (kx 2023-03-24 03:55:33 +0300 134)       else
bfc1508d (kx 2023-03-24 03:55:33 +0300 135)       {
bfc1508d (kx 2023-03-24 03:55:33 +0300 136)         csvn_print_file_page();
bfc1508d (kx 2023-03-24 03:55:33 +0300 137)       }
bfc1508d (kx 2023-03-24 03:55:33 +0300 138)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300 139)     else if( ctx.repo.relative_info.kind == KIND_DIR )
bfc1508d (kx 2023-03-24 03:55:33 +0300 140)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300 141)       csvn_print_tree_page();
bfc1508d (kx 2023-03-24 03:55:33 +0300 142)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300 143)     else
bfc1508d (kx 2023-03-24 03:55:33 +0300 144)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300 145)       csvn_print_repolist_page();
bfc1508d (kx 2023-03-24 03:55:33 +0300 146)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300 147)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300 148) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 149) #if 0
bfc1508d (kx 2023-03-24 03:55:33 +0300 150)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300 151)     struct strbuf buf  = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300 152) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 153)     strbuf_addf( &buf, "        <div class=\"content segment\">\n" );
bfc1508d (kx 2023-03-24 03:55:33 +0300 154)     strbuf_addf( &buf, "          <div class=\"container\">\n" );
bfc1508d (kx 2023-03-24 03:55:33 +0300 155)     strbuf_addf( &buf, "            <div class=\"csvn-main-content\">\n" );
bfc1508d (kx 2023-03-24 03:55:33 +0300 156) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 157)     strbuf_addf( &buf, "<pre><code class='language-text'>HTTP_HOST = %s\n", ctx.env.http_host );
bfc1508d (kx 2023-03-24 03:55:33 +0300 158)     strbuf_addf( &buf, "HTTPS = %s\n", ctx.env.https );
bfc1508d (kx 2023-03-24 03:55:33 +0300 159)     strbuf_addf( &buf, "NO_HTTP = %s\n", ctx.env.no_http );
bfc1508d (kx 2023-03-24 03:55:33 +0300 160)     strbuf_addf( &buf, "PATH_INFO = %s\n", ctx.env.path_info );
bfc1508d (kx 2023-03-24 03:55:33 +0300 161)     strbuf_addf( &buf, "QUERY_STRING = %s\n", ctx.env.query_string );
bfc1508d (kx 2023-03-24 03:55:33 +0300 162)     strbuf_addf( &buf, "REQUEST_URI = %s\n", ctx.env.request_uri );
bfc1508d (kx 2023-03-24 03:55:33 +0300 163)     strbuf_addf( &buf, "REQUEST_SCHEME = %s\n", ctx.env.request_scheme );
bfc1508d (kx 2023-03-24 03:55:33 +0300 164)     strbuf_addf( &buf, "REQUEST_METHOD = %s\n", ctx.env.request_method );
bfc1508d (kx 2023-03-24 03:55:33 +0300 165)     strbuf_addf( &buf, "SCRIPT_NAME = %s\n", ctx.env.script_name );
bfc1508d (kx 2023-03-24 03:55:33 +0300 166)     strbuf_addf( &buf, "SERVER_NAME = %s\n", ctx.env.server_name );
bfc1508d (kx 2023-03-24 03:55:33 +0300 167)     strbuf_addf( &buf, "SERVER_PORT = %s\n", ctx.env.server_port );
bfc1508d (kx 2023-03-24 03:55:33 +0300 168)     strbuf_addf( &buf, "HTTP_COOKIE = %s\n", ctx.env.http_cookie );
bfc1508d (kx 2023-03-24 03:55:33 +0300 169)     strbuf_addf( &buf, "CONTENT_LENGTH = %d\n", ctx.env.content_lenght );
bfc1508d (kx 2023-03-24 03:55:33 +0300 170)     strbuf_addf( &buf, "HTTP_ROOT = %s\n", ctx.env.http_root );
bfc1508d (kx 2023-03-24 03:55:33 +0300 171) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 172)     strbuf_addf( &buf, "\naddition:\n" );
bfc1508d (kx 2023-03-24 03:55:33 +0300 173)     strbuf_addf( &buf, "DOCUMENT_ROOT = %s\n", getenv("DOCUMENT_ROOT") );
bfc1508d (kx 2023-03-24 03:55:33 +0300 174)     strbuf_addf( &buf, "DOCUMENT_URI = %s\n", getenv("DOCUMENT_URI") );
bfc1508d (kx 2023-03-24 03:55:33 +0300 175)     strbuf_addf( &buf, "PATH_TRANSLATED = %s\n", getenv("PATH_TRANSLATED") );
bfc1508d (kx 2023-03-24 03:55:33 +0300 176)     strbuf_addf( &buf, "SERVER_SOFTWARE = %s\n", getenv("SERVER_SOFTWARE") );
bfc1508d (kx 2023-03-24 03:55:33 +0300 177)     strbuf_addf( &buf, "SERVER_PROTOCOL = %s\n", getenv("SERVER_PROTOCOL") );
bfc1508d (kx 2023-03-24 03:55:33 +0300 178)     strbuf_addf( &buf, "SERVER_ADDR = %s\n", getenv("SERVER_ADDR") );
bfc1508d (kx 2023-03-24 03:55:33 +0300 179)     strbuf_addf( &buf, "REMOTE_ADDR = %s\n", getenv("REMOTE_ADDR") );
bfc1508d (kx 2023-03-24 03:55:33 +0300 180)     strbuf_addf( &buf, "GATEWAY_INTERFACE = %s\n", getenv("GATEWAY_INTERFACE") );
bfc1508d (kx 2023-03-24 03:55:33 +0300 181)     strbuf_addf( &buf, "SERVER_PROTOCOL = %s\n", getenv("SERVER_PROTOCOL") );
bfc1508d (kx 2023-03-24 03:55:33 +0300 182) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 183)     strbuf_addf( &buf, "\nctx:\n" );
bfc1508d (kx 2023-03-24 03:55:33 +0300 184)     strbuf_addf( &buf, "ctx.query.ofs = %d;\n", ctx.query.ofs );
bfc1508d (kx 2023-03-24 03:55:33 +0300 185)     strbuf_addf( &buf, "ctx.query.rev = %d;\n", ctx.query.rev );
bfc1508d (kx 2023-03-24 03:55:33 +0300 186)     strbuf_addf( &buf, "ctx.query.revision = '%s';\n", ctx.query.revision );
bfc1508d (kx 2023-03-24 03:55:33 +0300 187)     strbuf_addf( &buf, "ctx.query.operation = '%s';\n", ctx.query.operation );
bfc1508d (kx 2023-03-24 03:55:33 +0300 188)     strbuf_addf( &buf, "ctx.query.search = '%s';\n", ctx.query.search );
bfc1508d (kx 2023-03-24 03:55:33 +0300 189)     strbuf_addf( &buf, "\n" );
bfc1508d (kx 2023-03-24 03:55:33 +0300 190)     strbuf_addf( &buf, "ctx.repo.name = %s\n", ctx.repo.name );
c7693c71 (kx 2023-04-12 19:21:06 +0300 191)     strbuf_addf( &buf, "ctx.repo.repo_root = %s\n", ctx.repo.repo_root );
bfc1508d (kx 2023-03-24 03:55:33 +0300 192)     strbuf_addf( &buf, "ctx.repo.info = {\n" );
bfc1508d (kx 2023-03-24 03:55:33 +0300 193)     switch( ctx.repo.info.kind )
bfc1508d (kx 2023-03-24 03:55:33 +0300 194)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300 195)       case KIND_DIR:
bfc1508d (kx 2023-03-24 03:55:33 +0300 196)         strbuf_addf( &buf, "  kind = '%s';\n", "dir" );
bfc1508d (kx 2023-03-24 03:55:33 +0300 197)         break;
bfc1508d (kx 2023-03-24 03:55:33 +0300 198)       case KIND_FILE:
bfc1508d (kx 2023-03-24 03:55:33 +0300 199)         strbuf_addf( &buf, "  kind = '%s';\n", "file" );
bfc1508d (kx 2023-03-24 03:55:33 +0300 200)         break;
bfc1508d (kx 2023-03-24 03:55:33 +0300 201)       default:
bfc1508d (kx 2023-03-24 03:55:33 +0300 202)         strbuf_addf( &buf, "  kind = '%s';\n", "unknown" );
bfc1508d (kx 2023-03-24 03:55:33 +0300 203)         break;
bfc1508d (kx 2023-03-24 03:55:33 +0300 204)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300 205)     strbuf_addf( &buf, "  revision = %d;\n", ctx.repo.info.revision );
bfc1508d (kx 2023-03-24 03:55:33 +0300 206)     strbuf_addf( &buf, "  author = '%s';\n", ctx.repo.info.author );
bfc1508d (kx 2023-03-24 03:55:33 +0300 207)     strbuf_addf( &buf, "  date = %"PRIdMAX";\n", ctx.repo.info.date );
bfc1508d (kx 2023-03-24 03:55:33 +0300 208)     strbuf_addf( &buf, "  mime = '%s';\n", ctx.repo.info.mime );
bfc1508d (kx 2023-03-24 03:55:33 +0300 209)     strbuf_addf( &buf, "  lang = '%s';\n", ctx.repo.info.lang );
bfc1508d (kx 2023-03-24 03:55:33 +0300 210)     strbuf_addf( &buf, "}\n" );
bfc1508d (kx 2023-03-24 03:55:33 +0300 211) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 212)     strbuf_addf( &buf, "ctx.repo.relative_path = %s\n", ctx.repo.relative_path );
bfc1508d (kx 2023-03-24 03:55:33 +0300 213)     strbuf_addf( &buf, "ctx.repo.relative_info = {\n" );
bfc1508d (kx 2023-03-24 03:55:33 +0300 214)     switch( ctx.repo.relative_info.kind )
bfc1508d (kx 2023-03-24 03:55:33 +0300 215)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300 216)       case KIND_DIR:
bfc1508d (kx 2023-03-24 03:55:33 +0300 217)         strbuf_addf( &buf, "  kind = '%s';\n", "dir" );
bfc1508d (kx 2023-03-24 03:55:33 +0300 218)         break;
bfc1508d (kx 2023-03-24 03:55:33 +0300 219)       case KIND_FILE:
bfc1508d (kx 2023-03-24 03:55:33 +0300 220)         strbuf_addf( &buf, "  kind = '%s';\n", "file" );
bfc1508d (kx 2023-03-24 03:55:33 +0300 221)         break;
bfc1508d (kx 2023-03-24 03:55:33 +0300 222)       default:
bfc1508d (kx 2023-03-24 03:55:33 +0300 223)         strbuf_addf( &buf, "  kind = '%s';\n", "unknown" );
bfc1508d (kx 2023-03-24 03:55:33 +0300 224)         break;
bfc1508d (kx 2023-03-24 03:55:33 +0300 225)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300 226)     strbuf_addf( &buf, "  revision = %d;\n", ctx.repo.relative_info.revision );
bfc1508d (kx 2023-03-24 03:55:33 +0300 227)     strbuf_addf( &buf, "  author = '%s';\n", ctx.repo.relative_info.author );
bfc1508d (kx 2023-03-24 03:55:33 +0300 228)     strbuf_addf( &buf, "  date = %"PRIdMAX";\n", ctx.repo.relative_info.date );
bfc1508d (kx 2023-03-24 03:55:33 +0300 229)     strbuf_addf( &buf, "  mime = '%s';\n", ctx.repo.relative_info.mime );
bfc1508d (kx 2023-03-24 03:55:33 +0300 230)     strbuf_addf( &buf, "  lang = '%s';\n", ctx.repo.relative_info.lang );
bfc1508d (kx 2023-03-24 03:55:33 +0300 231)     strbuf_addf( &buf, "}\n" );
bfc1508d (kx 2023-03-24 03:55:33 +0300 232) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 233)     strbuf_addf( &buf, "ctx.repo.relative_href = %s\n", ctx.repo.relative_href );
bfc1508d (kx 2023-03-24 03:55:33 +0300 234)     strbuf_addf( &buf, "ctx.repo.relative_html = %s\n", ctx.repo.relative_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300 235) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 236)     strbuf_addf( &buf, "ctx.repo.trunk = %s\n", ctx.repo.trunk );
bfc1508d (kx 2023-03-24 03:55:33 +0300 237)     strbuf_addf( &buf, "ctx.repo.branches = %s\n", ctx.repo.branches );
bfc1508d (kx 2023-03-24 03:55:33 +0300 238)     strbuf_addf( &buf, "ctx.repo.tags = %s\n", ctx.repo.tags );
bfc1508d (kx 2023-03-24 03:55:33 +0300 239)     strbuf_addf( &buf, "ctx.repo.checkout_ro_prefix = %s\n", ctx.repo.checkout_ro_prefix );
bfc1508d (kx 2023-03-24 03:55:33 +0300 240)     strbuf_addf( &buf, "ctx.repo.checkout_prefix = %s\n", ctx.repo.checkout_prefix );
bfc1508d (kx 2023-03-24 03:55:33 +0300 241)     strbuf_addf( &buf, "ctx.repo.nbranches = %d\n", ctx.repo.nbranches );
bfc1508d (kx 2023-03-24 03:55:33 +0300 242)     strbuf_addf( &buf, "ctx.repo.ntags = %d\n", ctx.repo.ntags );
bfc1508d (kx 2023-03-24 03:55:33 +0300 243) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 244)     strbuf_addf( &buf, "ctx.vers.subversion = %s\n", ctx.vers.subversion );
bfc1508d (kx 2023-03-24 03:55:33 +0300 245)     strbuf_addf( &buf, "ctx.vers.nginx = %s\n", ctx.vers.nginx );
bfc1508d (kx 2023-03-24 03:55:33 +0300 246)     strbuf_addf( &buf, "ctx.vers.csvn = %s\n", ctx.vers.csvn );
bfc1508d (kx 2023-03-24 03:55:33 +0300 247) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 248)     strbuf_addf( &buf, "</code></pre>\n" );
bfc1508d (kx 2023-03-24 03:55:33 +0300 249) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 250)     print_config( &buf, config );
bfc1508d (kx 2023-03-24 03:55:33 +0300 251) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 252)     strbuf_addf( &buf, "            </div> <!-- End of csvn-main-content -->\n" );
bfc1508d (kx 2023-03-24 03:55:33 +0300 253)     strbuf_addf( &buf, "          </div> <!-- End of container -->\n" );
bfc1508d (kx 2023-03-24 03:55:33 +0300 254)     strbuf_addf( &buf, "        </div> <!-- End of content segment -->\n" );
bfc1508d (kx 2023-03-24 03:55:33 +0300 255) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 256)     ctx.page.size = buf.len;
bfc1508d (kx 2023-03-24 03:55:33 +0300 257) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 258)     strbuf_write( &buf, STDOUT_FILENO );
bfc1508d (kx 2023-03-24 03:55:33 +0300 259)     strbuf_release( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300 260)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300 261) #endif
bfc1508d (kx 2023-03-24 03:55:33 +0300 262) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 263)   csvn_release_template_variables();
bfc1508d (kx 2023-03-24 03:55:33 +0300 264)   free_resources();
bfc1508d (kx 2023-03-24 03:55:33 +0300 265) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 266)   return 0;
bfc1508d (kx 2023-03-24 03:55:33 +0300 267) }