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) }