cGit-UI for Git Repositories

cGit-UI – is a web interface for Git Repositories. cGit CGI script is writen in C and therefore it's fast enough

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