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 <strings.h>  /* strcasecmp(3) */
bfc1508d (kx 2023-03-24 03:55:33 +0300   24) #include <libgen.h>   /* basename(3)   */
bfc1508d (kx 2023-03-24 03:55:33 +0300   25) #include <ctype.h>    /* tolower(3)    */
bfc1508d (kx 2023-03-24 03:55:33 +0300   26) #include <errno.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300   27) #include <time.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300   28) #include <sys/time.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300   29) #include <pwd.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300   30) #include <grp.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300   31) #include <stdarg.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300   32) #include <locale.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300   33) #include <unistd.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300   34) 
bfc1508d (kx 2023-03-24 03:55:33 +0300   35) #include <nls.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300   36) 
bfc1508d (kx 2023-03-24 03:55:33 +0300   37) #include <defs.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300   38) 
bfc1508d (kx 2023-03-24 03:55:33 +0300   39) #include <fatal.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300   40) #include <http.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300   41) #include <html.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300   42) 
bfc1508d (kx 2023-03-24 03:55:33 +0300   43) #include <dlist.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300   44) #include <strbuf.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300   45) #include <repolist.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300   46) #include <wrapper.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300   47) #include <system.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300   48) #include <date.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300   49) 
bfc1508d (kx 2023-03-24 03:55:33 +0300   50) #include <ctx.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300   51) 
bfc1508d (kx 2023-03-24 03:55:33 +0300   52) #include <ui-shared.h>
bfc1508d (kx 2023-03-24 03:55:33 +0300   53) 
bfc1508d (kx 2023-03-24 03:55:33 +0300   54) 
bfc1508d (kx 2023-03-24 03:55:33 +0300   55) /* Allocate memory in .bss segment: */
bfc1508d (kx 2023-03-24 03:55:33 +0300   56) static struct __context mctx;
bfc1508d (kx 2023-03-24 03:55:33 +0300   57) 
bfc1508d (kx 2023-03-24 03:55:33 +0300   58) /* Share address of __context: */
bfc1508d (kx 2023-03-24 03:55:33 +0300   59) struct __context *pmctx = &mctx;
bfc1508d (kx 2023-03-24 03:55:33 +0300   60) 
bfc1508d (kx 2023-03-24 03:55:33 +0300   61) void __mctx_init( void )
bfc1508d (kx 2023-03-24 03:55:33 +0300   62) {
bfc1508d (kx 2023-03-24 03:55:33 +0300   63)   pmctx->_cur_brk = (void *)&((pmctx->_mem)[0]);
bfc1508d (kx 2023-03-24 03:55:33 +0300   64) }
bfc1508d (kx 2023-03-24 03:55:33 +0300   65) 
bfc1508d (kx 2023-03-24 03:55:33 +0300   66) static int
bfc1508d (kx 2023-03-24 03:55:33 +0300   67) __brk( void *end_d )
bfc1508d (kx 2023-03-24 03:55:33 +0300   68) {
bfc1508d (kx 2023-03-24 03:55:33 +0300   69)   void *ptr = __mem;
bfc1508d (kx 2023-03-24 03:55:33 +0300   70) 
bfc1508d (kx 2023-03-24 03:55:33 +0300   71)   if( (unsigned char *)end_d < (unsigned char *)ptr ||
bfc1508d (kx 2023-03-24 03:55:33 +0300   72)       (unsigned char *)end_d > (unsigned char *)ptr + CONTEXT_MEM_SIZE )
bfc1508d (kx 2023-03-24 03:55:33 +0300   73)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300   74)     errno = ENOMEM;
bfc1508d (kx 2023-03-24 03:55:33 +0300   75)     return( -1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300   76)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300   77) 
bfc1508d (kx 2023-03-24 03:55:33 +0300   78)  /*
bfc1508d (kx 2023-03-24 03:55:33 +0300   79)    __cur_brk = (unsigned char *)end_d;
bfc1508d (kx 2023-03-24 03:55:33 +0300   80) 
bfc1508d (kx 2023-03-24 03:55:33 +0300   81)    Функция  __brk()  лишь проверяет границы
bfc1508d (kx 2023-03-24 03:55:33 +0300   82)    области памяти, значение __cur_brk выставляется
bfc1508d (kx 2023-03-24 03:55:33 +0300   83)    в __sbrk() .
bfc1508d (kx 2023-03-24 03:55:33 +0300   84)   *************************************************/
bfc1508d (kx 2023-03-24 03:55:33 +0300   85) 
bfc1508d (kx 2023-03-24 03:55:33 +0300   86)   return( 0 );
bfc1508d (kx 2023-03-24 03:55:33 +0300   87) 
bfc1508d (kx 2023-03-24 03:55:33 +0300   88) } /* End of __brk() */
bfc1508d (kx 2023-03-24 03:55:33 +0300   89) 
bfc1508d (kx 2023-03-24 03:55:33 +0300   90) void *
bfc1508d (kx 2023-03-24 03:55:33 +0300   91) __sbrk( int incr )
bfc1508d (kx 2023-03-24 03:55:33 +0300   92) {
bfc1508d (kx 2023-03-24 03:55:33 +0300   93)   void         *ptr = __cur_brk;
bfc1508d (kx 2023-03-24 03:55:33 +0300   94)   register int  rc;
bfc1508d (kx 2023-03-24 03:55:33 +0300   95) 
bfc1508d (kx 2023-03-24 03:55:33 +0300   96)   if( incr == 0 ) return( ptr );
bfc1508d (kx 2023-03-24 03:55:33 +0300   97) 
bfc1508d (kx 2023-03-24 03:55:33 +0300   98)   rc = __brk( ptr + incr );
bfc1508d (kx 2023-03-24 03:55:33 +0300   99)   if( rc == -1 )
bfc1508d (kx 2023-03-24 03:55:33 +0300  100)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  101)     /* errno is set into __brk() */
bfc1508d (kx 2023-03-24 03:55:33 +0300  102)     return( (void *)0 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  103)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  104) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  105)   __cur_brk = ((unsigned char *)ptr) + (int)incr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  106) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  107)   return( ptr );
bfc1508d (kx 2023-03-24 03:55:33 +0300  108) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  109) } /* End of __sbrk() */
bfc1508d (kx 2023-03-24 03:55:33 +0300  110) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  111) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  112) struct csvn_context ctx;
bfc1508d (kx 2023-03-24 03:55:33 +0300  113) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  114) const char *ptype_repolist   = "repolist";
bfc1508d (kx 2023-03-24 03:55:33 +0300  115) const char *ptype_repo       = "repo";
bfc1508d (kx 2023-03-24 03:55:33 +0300  116) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  117) void csvn_prepare_context( void )
bfc1508d (kx 2023-03-24 03:55:33 +0300  118) {
bfc1508d (kx 2023-03-24 03:55:33 +0300  119)   memset( &ctx, 0, sizeof(ctx) );
bfc1508d (kx 2023-03-24 03:55:33 +0300  120) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  121)   ctx.env.http_host = getenv("HTTP_HOST");
bfc1508d (kx 2023-03-24 03:55:33 +0300  122)   ctx.env.https = getenv("HTTPS");
bfc1508d (kx 2023-03-24 03:55:33 +0300  123)   ctx.env.no_http = getenv("NO_HTTP");
bfc1508d (kx 2023-03-24 03:55:33 +0300  124)   ctx.env.path_info = getenv("PATH_INFO");
bfc1508d (kx 2023-03-24 03:55:33 +0300  125)   ctx.env.query_string = getenv("QUERY_STRING");
bfc1508d (kx 2023-03-24 03:55:33 +0300  126)   ctx.env.request_uri = getenv("REQUEST_URI");
bfc1508d (kx 2023-03-24 03:55:33 +0300  127) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  128)   if( ctx.env.request_uri == NULL )
bfc1508d (kx 2023-03-24 03:55:33 +0300  129)     ctx.env.request_uri = "/";
bfc1508d (kx 2023-03-24 03:55:33 +0300  130) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  131)   ctx.env.request_scheme = getenv("REQUEST_SCHEME");
bfc1508d (kx 2023-03-24 03:55:33 +0300  132)   ctx.env.request_method = getenv("REQUEST_METHOD");
bfc1508d (kx 2023-03-24 03:55:33 +0300  133)   ctx.env.script_name = getenv("SCRIPT_NAME");
bfc1508d (kx 2023-03-24 03:55:33 +0300  134)   ctx.env.server_name = getenv("SERVER_NAME");
bfc1508d (kx 2023-03-24 03:55:33 +0300  135)   ctx.env.server_port = getenv("SERVER_PORT");
bfc1508d (kx 2023-03-24 03:55:33 +0300  136)   ctx.env.http_cookie = getenv("HTTP_COOKIE");
bfc1508d (kx 2023-03-24 03:55:33 +0300  137)   ctx.env.content_lenght = getenv("CONTENT_LENGTH") ? strtoul(getenv("CONTENT_LENGTH"), NULL, 10) : 0;
bfc1508d (kx 2023-03-24 03:55:33 +0300  138)   ctx.env.http_root = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  139)   ctx.env.authenticated = 0;
bfc1508d (kx 2023-03-24 03:55:33 +0300  140) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  141)   ctx.query.ofs = 0;
bfc1508d (kx 2023-03-24 03:55:33 +0300  142)   ctx.query.rev = 0;
bfc1508d (kx 2023-03-24 03:55:33 +0300  143)   ctx.query.revision = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  144)   ctx.query.operation = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  145)   ctx.query.search = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  146) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  147)   ctx.page.mimetype = "text/html";
bfc1508d (kx 2023-03-24 03:55:33 +0300  148)   ctx.page.charset = "UTF-8";
bfc1508d (kx 2023-03-24 03:55:33 +0300  149)   ctx.page.size = 0;
bfc1508d (kx 2023-03-24 03:55:33 +0300  150)   ctx.page.modified = time(NULL);
bfc1508d (kx 2023-03-24 03:55:33 +0300  151)   ctx.page.expires = ctx.page.modified + 5 * 60;
bfc1508d (kx 2023-03-24 03:55:33 +0300  152)   ctx.page.status = 200;
bfc1508d (kx 2023-03-24 03:55:33 +0300  153)   ctx.page.status_message = "OK";
bfc1508d (kx 2023-03-24 03:55:33 +0300  154)   ctx.page.header = "/.csvn/html/header.html";
bfc1508d (kx 2023-03-24 03:55:33 +0300  155)   ctx.page.footer = "/.csvn/html/footer.html";
bfc1508d (kx 2023-03-24 03:55:33 +0300  156) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  157)   ctx.vars.css = "/.csvn/css/csvn.css";
bfc1508d (kx 2023-03-24 03:55:33 +0300  158)   ctx.vars.owner = "Andrey V.Kosteltsev";
bfc1508d (kx 2023-03-24 03:55:33 +0300  159)   ctx.vars.author = "Andrey V.Kosteltsev";
bfc1508d (kx 2023-03-24 03:55:33 +0300  160)   ctx.vars.description = "Subversion repositories hosted at Solar System, Earth";
bfc1508d (kx 2023-03-24 03:55:33 +0300  161)   ctx.vars.keywords = "cSvn repositories";
bfc1508d (kx 2023-03-24 03:55:33 +0300  162)   ctx.vars.title = "SVN Repositories";
bfc1508d (kx 2023-03-24 03:55:33 +0300  163)   ctx.vars.favicon_path = "/.csvn/pixmaps/favicon";
bfc1508d (kx 2023-03-24 03:55:33 +0300  164)   ctx.vars.syntax_highlight_css = "_csvn.css";
bfc1508d (kx 2023-03-24 03:55:33 +0300  165)   ctx.vars.logo = "/.csvn/pixmaps/csvn-banner-280x280.png";
bfc1508d (kx 2023-03-24 03:55:33 +0300  166)   ctx.vars.logo_alt = "Example.org";
bfc1508d (kx 2023-03-24 03:55:33 +0300  167)   ctx.vars.logo_link = "https://example.org";
bfc1508d (kx 2023-03-24 03:55:33 +0300  168)   ctx.vars.home_page = "https://example.org";
bfc1508d (kx 2023-03-24 03:55:33 +0300  169)   ctx.vars.snapshots = "tar.xz";
bfc1508d (kx 2023-03-24 03:55:33 +0300  170)   ctx.vars.status_line = "Subversion Repositories";
bfc1508d (kx 2023-03-24 03:55:33 +0300  171)   ctx.vars.main_menu_logo = "/.csvn/pixmaps/logo/SVN-logo-white-744x744.svg";
bfc1508d (kx 2023-03-24 03:55:33 +0300  172)   ctx.vars.main_menu_item = "<a href='/'>Index</a>";
bfc1508d (kx 2023-03-24 03:55:33 +0300  173)   ctx.vars.left_menu_items = "";
bfc1508d (kx 2023-03-24 03:55:33 +0300  174)   ctx.vars.popup_menu_items = "<div class='item'><span class='icon las la-home'></span><a href='https://example.org/' target='_blank'>Home page</a></div>";
bfc1508d (kx 2023-03-24 03:55:33 +0300  175)   ctx.vars.right_menu_items = "<div class='item'><a href='https://example.org/' target='_blank'>Home page</a></div>";
bfc1508d (kx 2023-03-24 03:55:33 +0300  176)   ctx.vars.copyright_notice = "By using any website materials you agree to indicate source.";
bfc1508d (kx 2023-03-24 03:55:33 +0300  177)   ctx.vars.copyright = "&#169; 2020 Andrey V.Kosteltsev. All Rights Reserved.";
bfc1508d (kx 2023-03-24 03:55:33 +0300  178)   ctx.vars.page_type = ptype_repolist;
bfc1508d (kx 2023-03-24 03:55:33 +0300  179)   ctx.vars.page_size = "200";
bfc1508d (kx 2023-03-24 03:55:33 +0300  180)   ctx.vars.num_of_repos = "0";
bfc1508d (kx 2023-03-24 03:55:33 +0300  181) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  182)   ctx.repo.name = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  183)   ctx.repo.info = CSVN_INFO_INIT;
c7693c71 (kx 2023-04-12 19:21:06 +0300  184)   ctx.repo.repo_root = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  185)   ctx.repo.relative_path = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  186)   ctx.repo.relative_info = CSVN_INFO_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300  187)   ctx.repo.relative_html = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  188)   ctx.repo.relative_href = "/";
bfc1508d (kx 2023-03-24 03:55:33 +0300  189)   ctx.repo.search_placeholder = "repository...";
bfc1508d (kx 2023-03-24 03:55:33 +0300  190)   ctx.repo.trunk = "trunk";
bfc1508d (kx 2023-03-24 03:55:33 +0300  191)   ctx.repo.branches = "branches";
bfc1508d (kx 2023-03-24 03:55:33 +0300  192)   ctx.repo.tags = "tags";
bfc1508d (kx 2023-03-24 03:55:33 +0300  193)   ctx.repo.checkout_prefix = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  194)   ctx.repo.checkout_ro_prefix = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  195)   ctx.repo.nbranches = 0;
bfc1508d (kx 2023-03-24 03:55:33 +0300  196)   ctx.repo.ntags = 0;
bfc1508d (kx 2023-03-24 03:55:33 +0300  197) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  198)   ctx.promo.analytic_links   = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  199)   ctx.promo.analytic_scripts = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  200)   ctx.promo.donate           = 0;
bfc1508d (kx 2023-03-24 03:55:33 +0300  201)   ctx.promo.donate_css       = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  202)   ctx.promo.donate_html      = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  203)   ctx.promo.donate_js        = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  204)   ctx.promo.donate_header    = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  205)   ctx.promo.donate_purpose   = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  206) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  207)   ctx.vers.subversion = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  208)   ctx.vers.nginx = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  209)   ctx.vers.csvn = PROGRAM_VERSION;
bfc1508d (kx 2023-03-24 03:55:33 +0300  210) }
bfc1508d (kx 2023-03-24 03:55:33 +0300  211) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  212) void csvn_prepare_template_variables( void )
bfc1508d (kx 2023-03-24 03:55:33 +0300  213) {
bfc1508d (kx 2023-03-24 03:55:33 +0300  214)   envtab_install( &strbuf_envtab, "css", ctx.vars.css, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  215)   envtab_install( &strbuf_envtab, "owner", ctx.vars.owner, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  216)   envtab_install( &strbuf_envtab, "author", ctx.vars.author, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  217)   envtab_install( &strbuf_envtab, "description", ctx.vars.description, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  218)   envtab_install( &strbuf_envtab, "keywords", ctx.vars.keywords, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  219)   envtab_install( &strbuf_envtab, "title", ctx.vars.title, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  220)   envtab_install( &strbuf_envtab, "favicon-path", ctx.vars.favicon_path, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  221)   envtab_install( &strbuf_envtab, "syntax-highlight-css", ctx.vars.syntax_highlight_css, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  222)   envtab_install( &strbuf_envtab, "logo", ctx.vars.logo, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  223)   envtab_install( &strbuf_envtab, "logo-alt", ctx.vars.logo_alt, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  224)   envtab_install( &strbuf_envtab, "logo-link", ctx.vars.logo_link, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  225)   envtab_install( &strbuf_envtab, "home-page", ctx.vars.home_page, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  226)   envtab_install( &strbuf_envtab, "snapshots", ctx.vars.snapshots, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  227)   envtab_install( &strbuf_envtab, "status-line", ctx.vars.status_line, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  228)   envtab_install( &strbuf_envtab, "main-menu-logo", ctx.vars.main_menu_logo, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  229)   envtab_install( &strbuf_envtab, "main-menu-item", ctx.vars.main_menu_item, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  230)   envtab_install( &strbuf_envtab, "left-menu-items", ctx.vars.left_menu_items, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  231)   envtab_install( &strbuf_envtab, "popup-menu-items", ctx.vars.popup_menu_items, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  232)   envtab_install( &strbuf_envtab, "right-menu-items", ctx.vars.right_menu_items, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  233) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  234)   envtab_install( &strbuf_envtab, "relative-html", ctx.repo.relative_html, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  235)   envtab_install( &strbuf_envtab, "search-placeholder", ctx.repo.search_placeholder, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  236) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  237)   envtab_install( &strbuf_envtab, "analytic-links", ctx.promo.analytic_links, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  238)   envtab_install( &strbuf_envtab, "analytic-scripts", ctx.promo.analytic_scripts, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  239)   envtab_install( &strbuf_envtab, "donate-css", ctx.promo.donate_css, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  240)   envtab_install( &strbuf_envtab, "donate-html", ctx.promo.donate_html, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  241)   envtab_install( &strbuf_envtab, "donate-js", ctx.promo.donate_js, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  242)   envtab_install( &strbuf_envtab, "donate-header", ctx.promo.donate_header, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  243)   envtab_install( &strbuf_envtab, "donate-purpose", ctx.promo.donate_purpose, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  244) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  245)   envtab_install( &strbuf_envtab, "svn-version", ctx.vers.subversion, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  246)   envtab_install( &strbuf_envtab, "nginx-version", ctx.vers.nginx, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  247)   envtab_install( &strbuf_envtab, "csvn-version", ctx.vers.csvn, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  248) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  249)   envtab_install( &strbuf_envtab, "copyright-notice", ctx.vars.copyright_notice, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  250)   envtab_install( &strbuf_envtab, "copyright", ctx.vars.copyright, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  251) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  252)   envtab_install( &strbuf_envtab, "page-type", ctx.vars.page_type, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  253)   envtab_install( &strbuf_envtab, "page-size", ctx.vars.page_size, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  254)   envtab_install( &strbuf_envtab, "num-of-repos", ctx.vars.num_of_repos, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  255) }
bfc1508d (kx 2023-03-24 03:55:33 +0300  256) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  257) void csvn_release_template_variables( void )
bfc1508d (kx 2023-03-24 03:55:33 +0300  258) {
bfc1508d (kx 2023-03-24 03:55:33 +0300  259)   envtab_release( &strbuf_envtab );
bfc1508d (kx 2023-03-24 03:55:33 +0300  260) }
bfc1508d (kx 2023-03-24 03:55:33 +0300  261) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  262) static void get_selfdir( void )
bfc1508d (kx 2023-03-24 03:55:33 +0300  263) {
bfc1508d (kx 2023-03-24 03:55:33 +0300  264)   char    path[PATH_MAX];
bfc1508d (kx 2023-03-24 03:55:33 +0300  265)   ssize_t len;
bfc1508d (kx 2023-03-24 03:55:33 +0300  266) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  267)   bzero( (void *)path, PATH_MAX );
bfc1508d (kx 2023-03-24 03:55:33 +0300  268) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  269)   len = readlink( "/proc/self/exe", &path[0], (size_t)PATH_MAX );
bfc1508d (kx 2023-03-24 03:55:33 +0300  270)   if( len > 0 && len < PATH_MAX )
bfc1508d (kx 2023-03-24 03:55:33 +0300  271)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  272)     char *selfdir = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  273) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  274)     selfdir = (char *)__sbrk( (int)len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  275)     strcpy( selfdir, (const char *)dirname( (char *)&path[0] ) );
bfc1508d (kx 2023-03-24 03:55:33 +0300  276)     ctx.env.http_root = selfdir;
bfc1508d (kx 2023-03-24 03:55:33 +0300  277)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  278)   else
bfc1508d (kx 2023-03-24 03:55:33 +0300  279)     fatal_html( "cannot get selfdir" );
bfc1508d (kx 2023-03-24 03:55:33 +0300  280) }
bfc1508d (kx 2023-03-24 03:55:33 +0300  281) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  282) static size_t read_http_root_raw_file( struct strbuf *sb, const char *fname )
bfc1508d (kx 2023-03-24 03:55:33 +0300  283) {
bfc1508d (kx 2023-03-24 03:55:33 +0300  284)   char    path[PATH_MAX];
bfc1508d (kx 2023-03-24 03:55:33 +0300  285)   int     fd = -1;
bfc1508d (kx 2023-03-24 03:55:33 +0300  286)   size_t  len = 0;
bfc1508d (kx 2023-03-24 03:55:33 +0300  287) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  288)   if( !sb || !fname || !*fname ) return len;
bfc1508d (kx 2023-03-24 03:55:33 +0300  289) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  290)   bzero( (void *)path, PATH_MAX );
bfc1508d (kx 2023-03-24 03:55:33 +0300  291)   strcpy( (char *)&path[0], ctx.env.http_root );
bfc1508d (kx 2023-03-24 03:55:33 +0300  292)   if( *fname != '/' )
bfc1508d (kx 2023-03-24 03:55:33 +0300  293)     strcat( (char *)&path[0], "/" );
bfc1508d (kx 2023-03-24 03:55:33 +0300  294) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  295)   strcat( (char *)&path[0], fname );
bfc1508d (kx 2023-03-24 03:55:33 +0300  296) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  297)   if( (fd = open( (const char *)&path[0], O_RDONLY )) == -1 )
bfc1508d (kx 2023-03-24 03:55:33 +0300  298)    fatal_html( "Cannot open %s file: %s", fname, strerror( errno ) );
bfc1508d (kx 2023-03-24 03:55:33 +0300  299) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  300)   len = strbuf_read( sb, fd, 0 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  301)   close( fd );
bfc1508d (kx 2023-03-24 03:55:33 +0300  302) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  303)   return len;
bfc1508d (kx 2023-03-24 03:55:33 +0300  304) }
bfc1508d (kx 2023-03-24 03:55:33 +0300  305) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  306) static size_t read_http_root_env_file( struct strbuf *sb, const char *fname )
bfc1508d (kx 2023-03-24 03:55:33 +0300  307) {
bfc1508d (kx 2023-03-24 03:55:33 +0300  308)   char    path[PATH_MAX];
bfc1508d (kx 2023-03-24 03:55:33 +0300  309)   FILE   *fp = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  310)   size_t  len = 0;
bfc1508d (kx 2023-03-24 03:55:33 +0300  311) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  312)   if( !sb || !fname || !*fname ) return len;
bfc1508d (kx 2023-03-24 03:55:33 +0300  313) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  314)   bzero( (void *)path, PATH_MAX );
bfc1508d (kx 2023-03-24 03:55:33 +0300  315)   strcpy( (char *)&path[0], ctx.env.http_root );
bfc1508d (kx 2023-03-24 03:55:33 +0300  316)   if( *fname != '/' )
bfc1508d (kx 2023-03-24 03:55:33 +0300  317)     strcat( (char *)&path[0], "/" );
bfc1508d (kx 2023-03-24 03:55:33 +0300  318) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  319)   strcat( (char *)&path[0], fname );
bfc1508d (kx 2023-03-24 03:55:33 +0300  320) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  321)   if( (fp = fopen( (const char *)&path[0], "r" )) == NULL )
bfc1508d (kx 2023-03-24 03:55:33 +0300  322)    fatal_html( "Cannot open %s file: %s", fname, strerror( errno ) );
bfc1508d (kx 2023-03-24 03:55:33 +0300  323) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  324)   len = strbuf_env_fread( sb, fp );
bfc1508d (kx 2023-03-24 03:55:33 +0300  325)   fclose( fp );
bfc1508d (kx 2023-03-24 03:55:33 +0300  326) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  327)   if( len > STRBUF_MAXLINE )
bfc1508d (kx 2023-03-24 03:55:33 +0300  328)     fatal_html( "The '%s' file is too large. No more than 8192 bytes is allowed for includes", fname );
bfc1508d (kx 2023-03-24 03:55:33 +0300  329) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  330)   return len;
bfc1508d (kx 2023-03-24 03:55:33 +0300  331) }
bfc1508d (kx 2023-03-24 03:55:33 +0300  332) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  333) static void read_donate_html( void )
bfc1508d (kx 2023-03-24 03:55:33 +0300  334) {
bfc1508d (kx 2023-03-24 03:55:33 +0300  335)   struct strbuf buf = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300  336)   char  *html = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  337) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  338)   if( !ctx.promo.donate ) return;
bfc1508d (kx 2023-03-24 03:55:33 +0300  339)   if( !ctx.promo.donate_html || !*ctx.promo.donate_html ) return;
bfc1508d (kx 2023-03-24 03:55:33 +0300  340) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  341)   (void)read_http_root_env_file( &buf, ctx.promo.donate_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  342) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  343)   html = (char *)__sbrk( (int)buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  344)   memcpy( (void *)html, (const void *)buf.buf, buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  345)   ctx.promo.donate_html = (const char *)html;
bfc1508d (kx 2023-03-24 03:55:33 +0300  346)   strbuf_release( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300  347) }
bfc1508d (kx 2023-03-24 03:55:33 +0300  348) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  349) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  350) static char psize[4] = { 0, 0, 0, 0 };
bfc1508d (kx 2023-03-24 03:55:33 +0300  351) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  352) static void ctx_page_size_from_global( void )
bfc1508d (kx 2023-03-24 03:55:33 +0300  353) {
bfc1508d (kx 2023-03-24 03:55:33 +0300  354)   struct variable f = { (unsigned char *)"page-size", { 0 }, DT_NUMERICAL }, *var = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  355)   var = lookup_global( lookup_global_section( config ), &f );
bfc1508d (kx 2023-03-24 03:55:33 +0300  356)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  357)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  358)     if( var->type == DT_NUMERICAL )
bfc1508d (kx 2023-03-24 03:55:33 +0300  359)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300  360)       if( var->_v.val > 9 && var->_v.val < 201 )
bfc1508d (kx 2023-03-24 03:55:33 +0300  361)         snprintf( &psize[0], 4, "%d", var->_v.val );
bfc1508d (kx 2023-03-24 03:55:33 +0300  362)       else
bfc1508d (kx 2023-03-24 03:55:33 +0300  363)         snprintf( &psize[0], 4, "%d", 200 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  364)       ctx.vars.page_size = &psize[0];
bfc1508d (kx 2023-03-24 03:55:33 +0300  365)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300  366)     else
bfc1508d (kx 2023-03-24 03:55:33 +0300  367)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300  368)       int size = 0;
bfc1508d (kx 2023-03-24 03:55:33 +0300  369)       sscanf( (const char *)var->_v.vptr, "%d", &size );
bfc1508d (kx 2023-03-24 03:55:33 +0300  370)       if( size > 9 && size < 201 )
bfc1508d (kx 2023-03-24 03:55:33 +0300  371)         ctx.vars.page_size = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  372)       else
bfc1508d (kx 2023-03-24 03:55:33 +0300  373)       {
bfc1508d (kx 2023-03-24 03:55:33 +0300  374)         snprintf( &psize[0], 4, "%d", 200 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  375)         ctx.vars.page_size = &psize[0];
bfc1508d (kx 2023-03-24 03:55:33 +0300  376)       }
bfc1508d (kx 2023-03-24 03:55:33 +0300  377)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300  378)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  379) }
bfc1508d (kx 2023-03-24 03:55:33 +0300  380) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  381) static void ctx_page_size_from_repo( struct repo *repo )
bfc1508d (kx 2023-03-24 03:55:33 +0300  382) {
bfc1508d (kx 2023-03-24 03:55:33 +0300  383)   struct variable f = { (unsigned char *)"page-size", { 0 }, DT_NUMERICAL }, *var = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  384)   var = lookup( repo, &f );
bfc1508d (kx 2023-03-24 03:55:33 +0300  385)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  386)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  387)     if( var->type == DT_NUMERICAL )
bfc1508d (kx 2023-03-24 03:55:33 +0300  388)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300  389)       if( var->_v.val > 9 && var->_v.val < 201 )
bfc1508d (kx 2023-03-24 03:55:33 +0300  390)         snprintf( &psize[0], 4, "%d", var->_v.val );
bfc1508d (kx 2023-03-24 03:55:33 +0300  391)       else
bfc1508d (kx 2023-03-24 03:55:33 +0300  392)         snprintf( &psize[0], 4, "%d", 200 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  393)       ctx.vars.page_size = &psize[0];
bfc1508d (kx 2023-03-24 03:55:33 +0300  394)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300  395)     else
bfc1508d (kx 2023-03-24 03:55:33 +0300  396)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300  397)       int size = 0;
bfc1508d (kx 2023-03-24 03:55:33 +0300  398)       sscanf( (const char *)var->_v.vptr, "%d", &size );
bfc1508d (kx 2023-03-24 03:55:33 +0300  399)       if( size > 9 && size < 201 )
bfc1508d (kx 2023-03-24 03:55:33 +0300  400)         ctx.vars.page_size = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  401)       else
bfc1508d (kx 2023-03-24 03:55:33 +0300  402)       {
bfc1508d (kx 2023-03-24 03:55:33 +0300  403)         snprintf( &psize[0], 4, "%d", 200 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  404)         ctx.vars.page_size = &psize[0];
bfc1508d (kx 2023-03-24 03:55:33 +0300  405)       }
bfc1508d (kx 2023-03-24 03:55:33 +0300  406)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300  407)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  408) }
bfc1508d (kx 2023-03-24 03:55:33 +0300  409) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  410) static void ctx_repo_dirs_from_global( void )
bfc1508d (kx 2023-03-24 03:55:33 +0300  411) {
c7693c71 (kx 2023-04-12 19:21:06 +0300  412)   struct variable  repo_root = { (unsigned char *)"repo-root", { 0 }, DT_PATH };
c7693c71 (kx 2023-04-12 19:21:06 +0300  413)   struct variable  trunk     = { (unsigned char *)"trunk",     { 0 }, DT_PATH };
c7693c71 (kx 2023-04-12 19:21:06 +0300  414)   struct variable  branches  = { (unsigned char *)"branches",  { 0 }, DT_PATH };
c7693c71 (kx 2023-04-12 19:21:06 +0300  415)   struct variable  tags      = { (unsigned char *)"tags",      { 0 }, DT_PATH };
bfc1508d (kx 2023-03-24 03:55:33 +0300  416)   struct variable  ro_prefix = { (unsigned char *)"checkout-prefix-readonly", { 0 }, DT_PATH };
bfc1508d (kx 2023-03-24 03:55:33 +0300  417)   struct variable  rw_prefix = { (unsigned char *)"checkout-prefix",          { 0 }, DT_PATH };
bfc1508d (kx 2023-03-24 03:55:33 +0300  418)   struct variable *var = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  419) 
c7693c71 (kx 2023-04-12 19:21:06 +0300  420)   var = lookup_global( lookup_global_section( config ), &repo_root );
c7693c71 (kx 2023-04-12 19:21:06 +0300  421)   if( var )
c7693c71 (kx 2023-04-12 19:21:06 +0300  422)   {
c7693c71 (kx 2023-04-12 19:21:06 +0300  423)     ctx.repo.repo_root = (const char *)var->_v.vptr;
c7693c71 (kx 2023-04-12 19:21:06 +0300  424)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  425)   var = lookup_global( lookup_global_section( config ), &trunk );
bfc1508d (kx 2023-03-24 03:55:33 +0300  426)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  427)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  428)     ctx.repo.trunk = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  429)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  430)   var = lookup_global( lookup_global_section( config ), &branches );
bfc1508d (kx 2023-03-24 03:55:33 +0300  431)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  432)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  433)     ctx.repo.branches = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  434)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  435)   var = lookup_global( lookup_global_section( config ), &tags );
bfc1508d (kx 2023-03-24 03:55:33 +0300  436)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  437)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  438)     ctx.repo.tags = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  439)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  440)   var = lookup_global( lookup_global_section( config ), &rw_prefix );
bfc1508d (kx 2023-03-24 03:55:33 +0300  441)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  442)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  443)     ctx.repo.checkout_prefix = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  444)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  445)   var = lookup_global( lookup_global_section( config ), &ro_prefix );
bfc1508d (kx 2023-03-24 03:55:33 +0300  446)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  447)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  448)     ctx.repo.checkout_ro_prefix = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  449)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  450) }
bfc1508d (kx 2023-03-24 03:55:33 +0300  451) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  452) static void ctx_site_vars_from_global( void )
bfc1508d (kx 2023-03-24 03:55:33 +0300  453) {
bfc1508d (kx 2023-03-24 03:55:33 +0300  454)   struct variable                   css = { (unsigned char *)"css",                  { 0 }, DT_PATH };
bfc1508d (kx 2023-03-24 03:55:33 +0300  455)   struct variable                 owner = { (unsigned char *)"owner",                { 0 }, DT_STRING };
bfc1508d (kx 2023-03-24 03:55:33 +0300  456)   struct variable                author = { (unsigned char *)"author",               { 0 }, DT_STRING };
bfc1508d (kx 2023-03-24 03:55:33 +0300  457)   struct variable                 title = { (unsigned char *)"title",                { 0 }, DT_STRING };
bfc1508d (kx 2023-03-24 03:55:33 +0300  458)   struct variable           description = { (unsigned char *)"description",          { 0 }, DT_STRING };
bfc1508d (kx 2023-03-24 03:55:33 +0300  459)   struct variable              keywords = { (unsigned char *)"keywords",             { 0 }, DT_STRING };
bfc1508d (kx 2023-03-24 03:55:33 +0300  460)   struct variable      copyright_notice = { (unsigned char *)"copyright-notice",     { 0 }, DT_STRING };
bfc1508d (kx 2023-03-24 03:55:33 +0300  461)   struct variable             copyright = { (unsigned char *)"copyright",            { 0 }, DT_STRING };
bfc1508d (kx 2023-03-24 03:55:33 +0300  462)   struct variable          favicon_path = { (unsigned char *)"favicon-path",         { 0 }, DT_PATH   };
bfc1508d (kx 2023-03-24 03:55:33 +0300  463)   struct variable                  logo = { (unsigned char *)"logo",                 { 0 }, DT_PATH   };
bfc1508d (kx 2023-03-24 03:55:33 +0300  464)   struct variable              logo_alt = { (unsigned char *)"logo-alt",             { 0 }, DT_STRING };
bfc1508d (kx 2023-03-24 03:55:33 +0300  465)   struct variable             logo_link = { (unsigned char *)"logo-link",            { 0 }, DT_STRING };
bfc1508d (kx 2023-03-24 03:55:33 +0300  466)   struct variable             home_page = { (unsigned char *)"home-page",            { 0 }, DT_STRING };
bfc1508d (kx 2023-03-24 03:55:33 +0300  467)   struct variable             snapshots = { (unsigned char *)"snapshots",            { 0 }, DT_PATH   };
bfc1508d (kx 2023-03-24 03:55:33 +0300  468)   struct variable        main_menu_logo = { (unsigned char *)"main-menu-logo",       { 0 }, DT_PATH   };
bfc1508d (kx 2023-03-24 03:55:33 +0300  469)   struct variable  syntax_highlight_css = { (unsigned char *)"syntax-highlight-css", { 0 }, DT_PATH   };
bfc1508d (kx 2023-03-24 03:55:33 +0300  470)   struct variable *var = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  471) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  472)   var = lookup_global( lookup_global_section( config ), &css );
bfc1508d (kx 2023-03-24 03:55:33 +0300  473)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  474)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  475)     ctx.vars.css = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  476)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  477)   var = lookup_global( lookup_global_section( config ), &owner );
bfc1508d (kx 2023-03-24 03:55:33 +0300  478)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  479)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  480)     ctx.vars.owner = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  481)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  482)   var = lookup_global( lookup_global_section( config ), &author );
bfc1508d (kx 2023-03-24 03:55:33 +0300  483)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  484)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  485)     ctx.vars.author = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  486)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  487)   var = lookup_global( lookup_global_section( config ), &title );
bfc1508d (kx 2023-03-24 03:55:33 +0300  488)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  489)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  490)     ctx.vars.title = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  491)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  492)   var = lookup_global( lookup_global_section( config ), &description );
bfc1508d (kx 2023-03-24 03:55:33 +0300  493)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  494)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  495)     ctx.vars.description = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  496)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  497)   var = lookup_global( lookup_global_section( config ), &keywords );
bfc1508d (kx 2023-03-24 03:55:33 +0300  498)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  499)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  500)     ctx.vars.keywords = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  501)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  502)   var = lookup_global( lookup_global_section( config ), &copyright_notice );
bfc1508d (kx 2023-03-24 03:55:33 +0300  503)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  504)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  505)     ctx.vars.copyright_notice = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  506)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  507)   var = lookup_global( lookup_global_section( config ), &copyright );
bfc1508d (kx 2023-03-24 03:55:33 +0300  508)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  509)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  510)     ctx.vars.copyright = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  511)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  512)   var = lookup_global( lookup_global_section( config ), &favicon_path );
bfc1508d (kx 2023-03-24 03:55:33 +0300  513)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  514)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  515)     ctx.vars.favicon_path = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  516)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  517)   var = lookup_global( lookup_global_section( config ), &logo );
bfc1508d (kx 2023-03-24 03:55:33 +0300  518)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  519)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  520)     ctx.vars.logo = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  521)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  522)   var = lookup_global( lookup_global_section( config ), &logo_alt );
bfc1508d (kx 2023-03-24 03:55:33 +0300  523)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  524)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  525)     ctx.vars.logo_alt = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  526)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  527)   var = lookup_global( lookup_global_section( config ), &logo_link );
bfc1508d (kx 2023-03-24 03:55:33 +0300  528)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  529)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  530)     ctx.vars.logo_link = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  531)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  532)   var = lookup_global( lookup_global_section( config ), &home_page );
bfc1508d (kx 2023-03-24 03:55:33 +0300  533)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  534)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  535)     ctx.vars.home_page = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  536)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  537)   var = lookup_global( lookup_global_section( config ), &snapshots );
bfc1508d (kx 2023-03-24 03:55:33 +0300  538)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  539)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  540)     ctx.vars.snapshots = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  541)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  542)   var = lookup_global( lookup_global_section( config ), &main_menu_logo );
bfc1508d (kx 2023-03-24 03:55:33 +0300  543)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  544)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  545)     ctx.vars.main_menu_logo = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  546)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  547)   var = lookup_global( lookup_global_section( config ), &syntax_highlight_css );
bfc1508d (kx 2023-03-24 03:55:33 +0300  548)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  549)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  550)     ctx.vars.syntax_highlight_css = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  551)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  552) }
bfc1508d (kx 2023-03-24 03:55:33 +0300  553) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  554) static void ctx_promo_vars_from_global( void )
bfc1508d (kx 2023-03-24 03:55:33 +0300  555) {
bfc1508d (kx 2023-03-24 03:55:33 +0300  556)   struct variable  analytic_links   = { (unsigned char *)"analytic-links",   { 0 }, DT_PATH      };
bfc1508d (kx 2023-03-24 03:55:33 +0300  557)   struct variable  analytic_scripts = { (unsigned char *)"analytic-scripts", { 0 }, DT_PATH      };
bfc1508d (kx 2023-03-24 03:55:33 +0300  558)   struct variable  donate           = { (unsigned char *)"donate",           { 0 }, DT_NUMERICAL };
bfc1508d (kx 2023-03-24 03:55:33 +0300  559)   struct variable  donate_css       = { (unsigned char *)"donate-css",       { 0 }, DT_PATH      };
bfc1508d (kx 2023-03-24 03:55:33 +0300  560)   struct variable  donate_html      = { (unsigned char *)"donate-html",      { 0 }, DT_PATH      };
bfc1508d (kx 2023-03-24 03:55:33 +0300  561)   struct variable  donate_js        = { (unsigned char *)"donate-js",        { 0 }, DT_PATH      };
bfc1508d (kx 2023-03-24 03:55:33 +0300  562)   struct variable  donate_header    = { (unsigned char *)"donate-header",    { 0 }, DT_STRING    };
bfc1508d (kx 2023-03-24 03:55:33 +0300  563)   struct variable  donate_purpose   = { (unsigned char *)"donate-purpose",   { 0 }, DT_STRING    };
bfc1508d (kx 2023-03-24 03:55:33 +0300  564)   struct variable *var = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  565) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  566)   var = lookup_global( lookup_global_section( config ), &analytic_links );
bfc1508d (kx 2023-03-24 03:55:33 +0300  567)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  568)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  569)     ctx.promo.analytic_links = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  570) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  571)     if( ctx.promo.analytic_links && *ctx.promo.analytic_links )
bfc1508d (kx 2023-03-24 03:55:33 +0300  572)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300  573)       struct strbuf buf = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300  574)       char  *links = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  575) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  576)       (void)read_http_root_raw_file( &buf, ctx.promo.analytic_links );
bfc1508d (kx 2023-03-24 03:55:33 +0300  577) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  578)       links = (char *)__sbrk( (int)buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  579)       memcpy( (void *)links, (const void *)buf.buf, buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  580)       ctx.promo.analytic_links = (const char *)links;
bfc1508d (kx 2023-03-24 03:55:33 +0300  581)       strbuf_release( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300  582)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300  583)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  584)   var = lookup_global( lookup_global_section( config ), &analytic_scripts );
bfc1508d (kx 2023-03-24 03:55:33 +0300  585)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  586)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  587)     ctx.promo.analytic_scripts = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  588) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  589)     if( ctx.promo.analytic_scripts && *ctx.promo.analytic_scripts )
bfc1508d (kx 2023-03-24 03:55:33 +0300  590)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300  591)       struct strbuf buf = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300  592)       char  *scripts = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  593) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  594)       (void)read_http_root_raw_file( &buf, ctx.promo.analytic_scripts );
bfc1508d (kx 2023-03-24 03:55:33 +0300  595) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  596)       scripts = (char *)__sbrk( (int)buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  597)       memcpy( (void *)scripts, (const void *)buf.buf, buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  598)       ctx.promo.analytic_scripts = (const char *)scripts;
bfc1508d (kx 2023-03-24 03:55:33 +0300  599)       strbuf_release( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300  600)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300  601)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  602) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  603)   var = lookup_global( lookup_global_section( config ), &donate );
bfc1508d (kx 2023-03-24 03:55:33 +0300  604)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  605)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  606)     if( var->type == DT_NUMERICAL )
bfc1508d (kx 2023-03-24 03:55:33 +0300  607)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300  608)       ctx.promo.donate = var->_v.val;
bfc1508d (kx 2023-03-24 03:55:33 +0300  609)       if( ctx.promo.donate )
bfc1508d (kx 2023-03-24 03:55:33 +0300  610)         ctx.promo.donate = 1;
bfc1508d (kx 2023-03-24 03:55:33 +0300  611)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300  612)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  613) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  614)   if( ctx.promo.donate )
bfc1508d (kx 2023-03-24 03:55:33 +0300  615)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  616)     var = lookup_global( lookup_global_section( config ), &donate_css );
bfc1508d (kx 2023-03-24 03:55:33 +0300  617)     if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  618)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300  619)       ctx.promo.donate_css = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  620) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  621)       if( ctx.promo.donate_css && *ctx.promo.donate_css )
bfc1508d (kx 2023-03-24 03:55:33 +0300  622)       {
bfc1508d (kx 2023-03-24 03:55:33 +0300  623)         struct strbuf buf = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300  624)         char  *css = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  625) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  626)         strbuf_addf( &buf, "<link rel=\"stylesheet\" href=\"%s\">", ctx.promo.donate_css );
bfc1508d (kx 2023-03-24 03:55:33 +0300  627)         strbuf_trim( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300  628)         css = (char *)__sbrk( (int)buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  629)         memcpy( (void *)css, (const void *)buf.buf, buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  630)         ctx.promo.donate_css = (const char *)css;
bfc1508d (kx 2023-03-24 03:55:33 +0300  631)         strbuf_release( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300  632)       }
bfc1508d (kx 2023-03-24 03:55:33 +0300  633)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300  634)     var = lookup_global( lookup_global_section( config ), &donate_js );
bfc1508d (kx 2023-03-24 03:55:33 +0300  635)     if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  636)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300  637)       ctx.promo.donate_js = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  638) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  639)       if( ctx.promo.donate_js && *ctx.promo.donate_js )
bfc1508d (kx 2023-03-24 03:55:33 +0300  640)       {
bfc1508d (kx 2023-03-24 03:55:33 +0300  641)         struct strbuf buf = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300  642)         char  *js = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  643) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  644)         strbuf_addf( &buf, "<script src=\"%s\"></script>", ctx.promo.donate_js );
bfc1508d (kx 2023-03-24 03:55:33 +0300  645)         strbuf_trim( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300  646)         js = (char *)__sbrk( (int)buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  647)         memcpy( (void *)js, (const void *)buf.buf, buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  648)         ctx.promo.donate_js = (const char *)js;
bfc1508d (kx 2023-03-24 03:55:33 +0300  649)         strbuf_release( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300  650)       }
bfc1508d (kx 2023-03-24 03:55:33 +0300  651)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300  652)     var = lookup_global( lookup_global_section( config ), &donate_header );
bfc1508d (kx 2023-03-24 03:55:33 +0300  653)     if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  654)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300  655)       ctx.promo.donate_header = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  656)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300  657)     var = lookup_global( lookup_global_section( config ), &donate_purpose );
bfc1508d (kx 2023-03-24 03:55:33 +0300  658)     if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  659)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300  660)       ctx.promo.donate_purpose = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  661)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300  662) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  663)     var = lookup_global( lookup_global_section( config ), &donate_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  664)     if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  665)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300  666)       ctx.promo.donate_html = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  667) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  668)       if( ctx.promo.donate_html && *ctx.promo.donate_html )
bfc1508d (kx 2023-03-24 03:55:33 +0300  669)       {
bfc1508d (kx 2023-03-24 03:55:33 +0300  670)         envtab_install( &strbuf_envtab, "donate-header", ctx.promo.donate_header, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  671)         envtab_install( &strbuf_envtab, "donate-purpose", ctx.promo.donate_purpose, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  672)         read_donate_html();
bfc1508d (kx 2023-03-24 03:55:33 +0300  673)         envtab_release( &strbuf_envtab );
bfc1508d (kx 2023-03-24 03:55:33 +0300  674)       }
bfc1508d (kx 2023-03-24 03:55:33 +0300  675)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300  676)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  677) }
bfc1508d (kx 2023-03-24 03:55:33 +0300  678) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  679) static void ctx_repo_dirs_from_repo( struct repo *repo )
bfc1508d (kx 2023-03-24 03:55:33 +0300  680) {
c7693c71 (kx 2023-04-12 19:21:06 +0300  681)   struct variable  repo_root = { (unsigned char *)"repo-root", { 0 }, DT_PATH };
c7693c71 (kx 2023-04-12 19:21:06 +0300  682)   struct variable  trunk     = { (unsigned char *)"trunk",     { 0 }, DT_PATH };
c7693c71 (kx 2023-04-12 19:21:06 +0300  683)   struct variable  branches  = { (unsigned char *)"branches",  { 0 }, DT_PATH };
c7693c71 (kx 2023-04-12 19:21:06 +0300  684)   struct variable  tags      = { (unsigned char *)"tags",      { 0 }, DT_PATH };
bfc1508d (kx 2023-03-24 03:55:33 +0300  685)   struct variable  ro_prefix = { (unsigned char *)"checkout-prefix-readonly", { 0 }, DT_PATH };
bfc1508d (kx 2023-03-24 03:55:33 +0300  686)   struct variable  rw_prefix = { (unsigned char *)"checkout-prefix",          { 0 }, DT_PATH };
bfc1508d (kx 2023-03-24 03:55:33 +0300  687)   struct variable *var = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  688) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  689)   if( !repo ) return;
bfc1508d (kx 2023-03-24 03:55:33 +0300  690) 
c7693c71 (kx 2023-04-12 19:21:06 +0300  691)   var = lookup( repo, &repo_root );
c7693c71 (kx 2023-04-12 19:21:06 +0300  692)   if( var )
c7693c71 (kx 2023-04-12 19:21:06 +0300  693)   {
c7693c71 (kx 2023-04-12 19:21:06 +0300  694)     ctx.repo.repo_root = (const char *)var->_v.vptr;
c7693c71 (kx 2023-04-12 19:21:06 +0300  695)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  696)   var = lookup( repo, &trunk );
bfc1508d (kx 2023-03-24 03:55:33 +0300  697)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  698)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  699)     ctx.repo.trunk = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  700)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  701)   var = lookup( repo, &branches );
bfc1508d (kx 2023-03-24 03:55:33 +0300  702)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  703)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  704)     ctx.repo.branches = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  705)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  706)   var = lookup( repo, &tags );
bfc1508d (kx 2023-03-24 03:55:33 +0300  707)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  708)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  709)     ctx.repo.tags = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  710)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  711)   var = lookup( repo, &rw_prefix );
bfc1508d (kx 2023-03-24 03:55:33 +0300  712)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  713)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  714)     ctx.repo.checkout_prefix = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  715)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  716)   var = lookup( repo, &ro_prefix );
bfc1508d (kx 2023-03-24 03:55:33 +0300  717)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  718)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  719)     ctx.repo.checkout_ro_prefix = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  720)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  721) }
bfc1508d (kx 2023-03-24 03:55:33 +0300  722) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  723) static void ctx_site_vars_from_repo( struct repo *repo )
bfc1508d (kx 2023-03-24 03:55:33 +0300  724) {
bfc1508d (kx 2023-03-24 03:55:33 +0300  725)   struct variable                   css = { (unsigned char *)"css",                  { 0 }, DT_PATH   };
bfc1508d (kx 2023-03-24 03:55:33 +0300  726)   struct variable                 owner = { (unsigned char *)"owner",                { 0 }, DT_STRING };
bfc1508d (kx 2023-03-24 03:55:33 +0300  727)   struct variable                author = { (unsigned char *)"author",               { 0 }, DT_STRING };
bfc1508d (kx 2023-03-24 03:55:33 +0300  728)   struct variable                 title = { (unsigned char *)"title",                { 0 }, DT_STRING };
bfc1508d (kx 2023-03-24 03:55:33 +0300  729)   struct variable           description = { (unsigned char *)"description",          { 0 }, DT_STRING };
bfc1508d (kx 2023-03-24 03:55:33 +0300  730)   struct variable              keywords = { (unsigned char *)"keywords",             { 0 }, DT_STRING };
bfc1508d (kx 2023-03-24 03:55:33 +0300  731)   struct variable      copyright_notice = { (unsigned char *)"copyright-notice",     { 0 }, DT_STRING };
bfc1508d (kx 2023-03-24 03:55:33 +0300  732)   struct variable             copyright = { (unsigned char *)"copyright",            { 0 }, DT_STRING };
bfc1508d (kx 2023-03-24 03:55:33 +0300  733)   struct variable          favicon_path = { (unsigned char *)"favicon-path",         { 0 }, DT_PATH   };
bfc1508d (kx 2023-03-24 03:55:33 +0300  734)   struct variable                  logo = { (unsigned char *)"logo",                 { 0 }, DT_PATH   };
bfc1508d (kx 2023-03-24 03:55:33 +0300  735)   struct variable              logo_alt = { (unsigned char *)"logo-alt",             { 0 }, DT_STRING };
bfc1508d (kx 2023-03-24 03:55:33 +0300  736)   struct variable             logo_link = { (unsigned char *)"logo-link",            { 0 }, DT_STRING };
bfc1508d (kx 2023-03-24 03:55:33 +0300  737)   struct variable             home_page = { (unsigned char *)"home-page",            { 0 }, DT_STRING };
bfc1508d (kx 2023-03-24 03:55:33 +0300  738)   struct variable             snapshots = { (unsigned char *)"snapshots",            { 0 }, DT_PATH   };
bfc1508d (kx 2023-03-24 03:55:33 +0300  739)   struct variable        main_menu_logo = { (unsigned char *)"main-menu-logo",       { 0 }, DT_PATH   };
bfc1508d (kx 2023-03-24 03:55:33 +0300  740)   struct variable  syntax_highlight_css = { (unsigned char *)"syntax-highlight-css", { 0 }, DT_PATH   };
bfc1508d (kx 2023-03-24 03:55:33 +0300  741)   struct variable *var = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  742) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  743)   if( !repo ) return;
bfc1508d (kx 2023-03-24 03:55:33 +0300  744) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  745)   var = lookup( repo, &css );
bfc1508d (kx 2023-03-24 03:55:33 +0300  746)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  747)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  748)     ctx.vars.css = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  749)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  750)   var = lookup( repo, &owner );
bfc1508d (kx 2023-03-24 03:55:33 +0300  751)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  752)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  753)     ctx.vars.owner = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  754)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  755)   var = lookup( repo, &author );
bfc1508d (kx 2023-03-24 03:55:33 +0300  756)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  757)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  758)     ctx.vars.author = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  759)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  760)   var = lookup( repo, &title );
bfc1508d (kx 2023-03-24 03:55:33 +0300  761)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  762)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  763)     ctx.vars.title = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  764)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  765)   var = lookup( repo, &description );
bfc1508d (kx 2023-03-24 03:55:33 +0300  766)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  767)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  768)     ctx.vars.description = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  769)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  770)   var = lookup( repo, &keywords );
bfc1508d (kx 2023-03-24 03:55:33 +0300  771)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  772)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  773)     ctx.vars.keywords = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  774)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  775)   var = lookup( repo, &copyright_notice );
bfc1508d (kx 2023-03-24 03:55:33 +0300  776)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  777)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  778)     ctx.vars.copyright_notice = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  779)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  780)   var = lookup( repo, &copyright );
bfc1508d (kx 2023-03-24 03:55:33 +0300  781)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  782)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  783)     ctx.vars.copyright = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  784)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  785)   var = lookup( repo, &favicon_path );
bfc1508d (kx 2023-03-24 03:55:33 +0300  786)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  787)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  788)     ctx.vars.favicon_path = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  789)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  790)   var = lookup( repo, &logo );
bfc1508d (kx 2023-03-24 03:55:33 +0300  791)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  792)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  793)     ctx.vars.logo = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  794)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  795)   var = lookup( repo, &logo_alt );
bfc1508d (kx 2023-03-24 03:55:33 +0300  796)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  797)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  798)     ctx.vars.logo_alt = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  799)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  800)   var = lookup( repo, &logo_link );
bfc1508d (kx 2023-03-24 03:55:33 +0300  801)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  802)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  803)     ctx.vars.logo_link = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  804)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  805)   var = lookup( repo, &home_page );
bfc1508d (kx 2023-03-24 03:55:33 +0300  806)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  807)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  808)     ctx.vars.home_page = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  809)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  810)   var = lookup( repo, &snapshots );
bfc1508d (kx 2023-03-24 03:55:33 +0300  811)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  812)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  813)     ctx.vars.snapshots = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  814)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  815)   var = lookup( repo, &main_menu_logo );
bfc1508d (kx 2023-03-24 03:55:33 +0300  816)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  817)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  818)     ctx.vars.main_menu_logo = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  819)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  820)   var = lookup( repo, &syntax_highlight_css );
bfc1508d (kx 2023-03-24 03:55:33 +0300  821)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  822)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  823)     ctx.vars.syntax_highlight_css = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  824)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  825) }
bfc1508d (kx 2023-03-24 03:55:33 +0300  826) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  827) static void ctx_promo_vars_from_repo( struct repo *repo )
bfc1508d (kx 2023-03-24 03:55:33 +0300  828) {
bfc1508d (kx 2023-03-24 03:55:33 +0300  829)   struct variable  analytic_links   = { (unsigned char *)"analytic-links",   { 0 }, DT_PATH      };
bfc1508d (kx 2023-03-24 03:55:33 +0300  830)   struct variable  analytic_scripts = { (unsigned char *)"analytic-scripts", { 0 }, DT_PATH      };
bfc1508d (kx 2023-03-24 03:55:33 +0300  831)   struct variable  donate           = { (unsigned char *)"donate",           { 0 }, DT_NUMERICAL };
bfc1508d (kx 2023-03-24 03:55:33 +0300  832)   struct variable  donate_css       = { (unsigned char *)"donate-css",       { 0 }, DT_PATH      };
bfc1508d (kx 2023-03-24 03:55:33 +0300  833)   struct variable  donate_html      = { (unsigned char *)"donate-html",      { 0 }, DT_PATH      };
bfc1508d (kx 2023-03-24 03:55:33 +0300  834)   struct variable  donate_js        = { (unsigned char *)"donate-js",        { 0 }, DT_PATH      };
bfc1508d (kx 2023-03-24 03:55:33 +0300  835)   struct variable  donate_header    = { (unsigned char *)"donate-header",    { 0 }, DT_STRING    };
bfc1508d (kx 2023-03-24 03:55:33 +0300  836)   struct variable  donate_purpose   = { (unsigned char *)"donate-purpose",   { 0 }, DT_STRING    };
bfc1508d (kx 2023-03-24 03:55:33 +0300  837)   struct variable *var = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  838) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  839)   /*
bfc1508d (kx 2023-03-24 03:55:33 +0300  840)     Analytics reads from global section only:
bfc1508d (kx 2023-03-24 03:55:33 +0300  841)    */
bfc1508d (kx 2023-03-24 03:55:33 +0300  842)   var = lookup_global( lookup_global_section( config ), &analytic_links );
bfc1508d (kx 2023-03-24 03:55:33 +0300  843)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  844)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  845)     ctx.promo.analytic_links = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  846) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  847)     if( ctx.promo.analytic_links && *ctx.promo.analytic_links )
bfc1508d (kx 2023-03-24 03:55:33 +0300  848)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300  849)       struct strbuf buf = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300  850)       char  *links = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  851) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  852)       (void)read_http_root_raw_file( &buf, ctx.promo.analytic_links );
bfc1508d (kx 2023-03-24 03:55:33 +0300  853) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  854)       links = (char *)__sbrk( (int)buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  855)       memcpy( (void *)links, (const void *)buf.buf, buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  856)       ctx.promo.analytic_links = (const char *)links;
bfc1508d (kx 2023-03-24 03:55:33 +0300  857)       strbuf_release( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300  858)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300  859)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  860)   var = lookup_global( lookup_global_section( config ), &analytic_scripts );
bfc1508d (kx 2023-03-24 03:55:33 +0300  861)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  862)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  863)     ctx.promo.analytic_scripts = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  864) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  865)     if( ctx.promo.analytic_scripts && *ctx.promo.analytic_scripts )
bfc1508d (kx 2023-03-24 03:55:33 +0300  866)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300  867)       struct strbuf buf = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300  868)       char  *scripts = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  869) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  870)       (void)read_http_root_raw_file( &buf, ctx.promo.analytic_scripts );
bfc1508d (kx 2023-03-24 03:55:33 +0300  871) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  872)       scripts = (char *)__sbrk( (int)buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  873)       memcpy( (void *)scripts, (const void *)buf.buf, buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  874)       ctx.promo.analytic_scripts = (const char *)scripts;
bfc1508d (kx 2023-03-24 03:55:33 +0300  875)       strbuf_release( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300  876)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300  877)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  878) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  879)   var = lookup( repo, &donate );
bfc1508d (kx 2023-03-24 03:55:33 +0300  880)   if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  881)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  882)     if( var->type == DT_NUMERICAL )
bfc1508d (kx 2023-03-24 03:55:33 +0300  883)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300  884)       ctx.promo.donate = var->_v.val;
bfc1508d (kx 2023-03-24 03:55:33 +0300  885)       if( ctx.promo.donate )
bfc1508d (kx 2023-03-24 03:55:33 +0300  886)         ctx.promo.donate = 1;
bfc1508d (kx 2023-03-24 03:55:33 +0300  887)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300  888)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  889) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  890)   if( ctx.promo.donate )
bfc1508d (kx 2023-03-24 03:55:33 +0300  891)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  892)     var = lookup( repo, &donate_css );
bfc1508d (kx 2023-03-24 03:55:33 +0300  893)     if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  894)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300  895)       ctx.promo.donate_css = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  896) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  897)       if( ctx.promo.donate_css && *ctx.promo.donate_css )
bfc1508d (kx 2023-03-24 03:55:33 +0300  898)       {
bfc1508d (kx 2023-03-24 03:55:33 +0300  899)         struct strbuf buf = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300  900)         char  *css = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  901) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  902)         strbuf_addf( &buf, "<link rel=\"stylesheet\" href=\"%s\">", ctx.promo.donate_css );
bfc1508d (kx 2023-03-24 03:55:33 +0300  903)         strbuf_trim( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300  904)         css = (char *)__sbrk( (int)buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  905)         memcpy( (void *)css, (const void *)buf.buf, buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  906)         ctx.promo.donate_css = (const char *)css;
bfc1508d (kx 2023-03-24 03:55:33 +0300  907)         strbuf_release( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300  908)       }
bfc1508d (kx 2023-03-24 03:55:33 +0300  909)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300  910)     var = lookup( repo, &donate_js );
bfc1508d (kx 2023-03-24 03:55:33 +0300  911)     if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  912)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300  913)       ctx.promo.donate_js = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  914) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  915)       if( ctx.promo.donate_js && *ctx.promo.donate_js )
bfc1508d (kx 2023-03-24 03:55:33 +0300  916)       {
bfc1508d (kx 2023-03-24 03:55:33 +0300  917)         struct strbuf buf = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300  918)         char  *js = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  919) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  920)         strbuf_addf( &buf, "<script src=\"%s\"></script>", ctx.promo.donate_js );
bfc1508d (kx 2023-03-24 03:55:33 +0300  921)         strbuf_trim( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300  922)         js = (char *)__sbrk( (int)buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  923)         memcpy( (void *)js, (const void *)buf.buf, buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  924)         ctx.promo.donate_js = (const char *)js;
bfc1508d (kx 2023-03-24 03:55:33 +0300  925)         strbuf_release( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300  926)       }
bfc1508d (kx 2023-03-24 03:55:33 +0300  927)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300  928)     var = lookup( repo, &donate_header );
bfc1508d (kx 2023-03-24 03:55:33 +0300  929)     if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  930)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300  931)       ctx.promo.donate_header = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  932)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300  933)     var = lookup( repo, &donate_purpose );
bfc1508d (kx 2023-03-24 03:55:33 +0300  934)     if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  935)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300  936)       ctx.promo.donate_purpose = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  937)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300  938)     var = lookup( repo, &donate_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  939)     if( var )
bfc1508d (kx 2023-03-24 03:55:33 +0300  940)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300  941)       ctx.promo.donate_html = (const char *)var->_v.vptr;
bfc1508d (kx 2023-03-24 03:55:33 +0300  942) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  943)       if( ctx.promo.donate_html && *ctx.promo.donate_html )
bfc1508d (kx 2023-03-24 03:55:33 +0300  944)       {
bfc1508d (kx 2023-03-24 03:55:33 +0300  945)         envtab_install( &strbuf_envtab, "donate-header", ctx.promo.donate_header, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  946)         envtab_install( &strbuf_envtab, "donate-purpose", ctx.promo.donate_purpose, fatal_html );
bfc1508d (kx 2023-03-24 03:55:33 +0300  947)         read_donate_html();
bfc1508d (kx 2023-03-24 03:55:33 +0300  948)         envtab_release( &strbuf_envtab );
bfc1508d (kx 2023-03-24 03:55:33 +0300  949)       }
bfc1508d (kx 2023-03-24 03:55:33 +0300  950)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300  951)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  952) }
bfc1508d (kx 2023-03-24 03:55:33 +0300  953) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  954) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  955) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  956) static char nrepos[11] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
bfc1508d (kx 2023-03-24 03:55:33 +0300  957) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  958) static void ctx_num_of_repos( void )
bfc1508d (kx 2023-03-24 03:55:33 +0300  959) {
bfc1508d (kx 2023-03-24 03:55:33 +0300  960)   int32_t  num = repolist_length( config );
bfc1508d (kx 2023-03-24 03:55:33 +0300  961)   num &= 0x7fffffff;
bfc1508d (kx 2023-03-24 03:55:33 +0300  962)   if( num > 0 )
bfc1508d (kx 2023-03-24 03:55:33 +0300  963)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300  964)     snprintf( &nrepos[0], 11, "%d", num );
bfc1508d (kx 2023-03-24 03:55:33 +0300  965)     ctx.vars.num_of_repos = &nrepos[0];
bfc1508d (kx 2023-03-24 03:55:33 +0300  966)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300  967) }
bfc1508d (kx 2023-03-24 03:55:33 +0300  968) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  969) static void ctx_repolist_status_line( void )
bfc1508d (kx 2023-03-24 03:55:33 +0300  970) {
bfc1508d (kx 2023-03-24 03:55:33 +0300  971)   struct strbuf buf = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300  972)   char    *nrepos_string = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  973)   char    *status_line   = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300  974)   int32_t  num = 0;
bfc1508d (kx 2023-03-24 03:55:33 +0300  975) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  976)   sscanf( ctx.vars.num_of_repos, "%d", &num );
bfc1508d (kx 2023-03-24 03:55:33 +0300  977) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  978)   strbuf_addf( &buf, Q_("%d Subversion Repository", "%d Subversion Repositories", num), num );
bfc1508d (kx 2023-03-24 03:55:33 +0300  979)   nrepos_string = (char *)__sbrk( (int)buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  980)   memcpy( (void *)nrepos_string, (const void *)buf.buf, buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  981)   strbuf_release( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300  982) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  983)   buf.alloc = 0, buf.len = 0, buf.fatal = strbuf_fatal, buf.buf = strbuf_slopbuf;
bfc1508d (kx 2023-03-24 03:55:33 +0300  984) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  985)   strbuf_addf( &buf, "<span class=\"las la-cloud-upload\"></span> %s\n", nrepos_string );
bfc1508d (kx 2023-03-24 03:55:33 +0300  986)   if( ctx.promo.donate )
bfc1508d (kx 2023-03-24 03:55:33 +0300  987)     strbuf_addf( &buf, "&nbsp; | <a class=\"donate\"><span class=\"icon las la-credit-card\"></span> Donate</a>\n" );
bfc1508d (kx 2023-03-24 03:55:33 +0300  988) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  989)   status_line = (char *)__sbrk( (int)buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  990)   memcpy( (void *)status_line, (const void *)buf.buf, buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300  991)   strbuf_release( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300  992) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  993)   ctx.vars.status_line = (const char *)status_line;
bfc1508d (kx 2023-03-24 03:55:33 +0300  994) }
bfc1508d (kx 2023-03-24 03:55:33 +0300  995) 
bfc1508d (kx 2023-03-24 03:55:33 +0300  996) static void ctx_repo_status_line( struct csvn_repository *rctx )
bfc1508d (kx 2023-03-24 03:55:33 +0300  997) {
bfc1508d (kx 2023-03-24 03:55:33 +0300  998)   struct strbuf buf      = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300  999)   struct strbuf commits  = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1000)   struct strbuf branches = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1001)   struct strbuf tags     = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1002)   char  *status_line = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1003) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1004)   if( !rctx ) return;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1005) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1006)   strbuf_addf( &commits, Q_("%d Commit", "%d Commits", rctx->info.revision), rctx->info.revision );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1007)   strbuf_addf( &branches, Q_("%d Branch", "%d Branches", rctx->nbranches), rctx->nbranches );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1008)   strbuf_addf( &tags, Q_("%d Tag", "%d Tags", rctx->ntags), rctx->ntags );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1009) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1010)   strbuf_addf( &buf, "<span class=\"las la-code-commit\"></span> %s &nbsp;\n", commits.buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1011)   strbuf_addf( &buf, "<span class=\"las la-code-branch\"></span> %s &nbsp;\n", branches.buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1012)   strbuf_addf( &buf, "<span class=\"las la-tags\"></span> %s\n", tags.buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1013)   if( ctx.promo.donate )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1014)     strbuf_addf( &buf, "&nbsp; | <a class=\"donate\"><span class=\"icon las la-credit-card\"></span> Donate</a>\n" );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1015) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1016)   strbuf_release( &commits );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1017)   strbuf_release( &branches );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1018)   strbuf_release( &tags );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1019) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1020)   status_line = (char *)__sbrk( (int)buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1021)   memcpy( (void *)status_line, (const void *)buf.buf, buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1022)   strbuf_release( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1023) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1024)   ctx.vars.status_line = (const char *)status_line;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1025) }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1026) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1027) static void ctx_repolist_menu( void )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1028) {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1029)   struct strbuf mmenu = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1030)   struct strbuf popup = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1031)   struct strbuf right = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1032) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1033)   char *main_menu  = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1034)   char *popup_menu = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1035)   char *right_menu = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1036) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1037)   strbuf_addf( &mmenu, "<a href=\"/\">Index</a>\n" );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1038)   strbuf_addf( &popup, "<div class=\"item\"><span class=\"icon las la-home\"></span><a href=\"%s\" target=\"_blank\">Home page</a></div>\n", ctx.vars.home_page );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1039)   strbuf_addf( &right, "<div class=\"item\"><a href=\"%s\" target=\"_blank\">Home page</a></div>\n", ctx.vars.home_page );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1040) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1041)   main_menu = (char *)__sbrk( (int)mmenu.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1042)   memcpy( (void *)main_menu, (const void *)mmenu.buf, mmenu.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1043)   strbuf_release( &mmenu );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1044)   ctx.vars.main_menu_item = (const char *)main_menu;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1045) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1046)   popup_menu = (char *)__sbrk( (int)popup.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1047)   memcpy( (void *)popup_menu, (const void *)popup.buf, popup.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1048)   strbuf_release( &popup );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1049)   ctx.vars.popup_menu_items = (const char *)popup_menu;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1050) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1051)   right_menu = (char *)__sbrk( (int)right.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1052)   memcpy( (void *)right_menu, (const void *)right.buf, right.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1053)   strbuf_release( &right );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1054)   ctx.vars.right_menu_items = (const char *)right_menu;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1055) }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1056) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1057) static void ctx_repo_menu( struct csvn_repository *rctx )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1058) {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1059)   struct strbuf mmenu = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1060)   struct strbuf left  = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1061)   struct strbuf popup = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1062)   struct strbuf right = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1063) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1064)   char *main_menu  = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1065)   char *left_menu  = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1066)   char *popup_menu = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1067)   char *right_menu = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1068) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1069)   if( !rctx ) return;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1070) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1071)   strbuf_addf( &mmenu, "<a href=\"/\">Index</a>\n" );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1072) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1073)   strbuf_addf( &left, "<div class=\"item\"><a href=\"/%s/%s/\">Trunk</a></div>\n", rctx->name, rctx->trunk );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1074)   strbuf_addf( &left, "<div class=\"item\"><a href=\"/%s/%s/\">Branches</a></div>\n", rctx->name, rctx->branches );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1075)   strbuf_addf( &left, "<div class=\"item\"><a href=\"/%s/%s/\">Tags</a></div>\n", rctx->name, rctx->tags );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1076) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1077)   strbuf_addf( &popup, "<div class=\"item\"><span class=\"icon las la-road\"></span><a href=\"/%s/%s/\">Trunk</a></div>\n", rctx->name, rctx->trunk );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1078)   strbuf_addf( &popup, "<div class=\"item\"><span class=\"icon las la-code-branch\"></span><a href=\"/%s/%s/\">Branches</a></div>\n", rctx->name, rctx->branches );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1079)   strbuf_addf( &popup, "<div class=\"item\"><span class=\"icon las la-tags\"></span><a href=\"/%s/%s/\">Tags</a></div>\n", rctx->name, rctx->tags );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1080)   strbuf_addf( &popup, "<div class=\"divider\"></div>\n" );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1081)   strbuf_addf( &popup, "<div class=\"item\"><span class=\"icon las la-home\"></span><a href=\"%s\" target=\"_blank\">Home page</a></div>\n", ctx.vars.home_page );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1082) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1083)   strbuf_addf( &right, "<div class=\"item\"><a href=\"%s\" target=\"_blank\">Home page</a></div>\n", ctx.vars.home_page );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1084) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1085)   main_menu = (char *)__sbrk( (int)mmenu.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1086)   memcpy( (void *)main_menu, (const void *)mmenu.buf, mmenu.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1087)   strbuf_release( &mmenu );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1088)   ctx.vars.main_menu_item = (const char *)main_menu;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1089) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1090)   left_menu = (char *)__sbrk( (int)left.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1091)   memcpy( (void *)left_menu, (const void *)left.buf, left.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1092)   strbuf_release( &left );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1093)   ctx.vars.left_menu_items = (const char *)left_menu;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1094) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1095)   popup_menu = (char *)__sbrk( (int)popup.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1096)   memcpy( (void *)popup_menu, (const void *)popup.buf, popup.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1097)   strbuf_release( &popup );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1098)   ctx.vars.popup_menu_items = (const char *)popup_menu;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1099) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1100)   right_menu = (char *)__sbrk( (int)right.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1101)   memcpy( (void *)right_menu, (const void *)right.buf, right.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1102)   strbuf_release( &right );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1103)   ctx.vars.right_menu_items = (const char *)right_menu;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1104) }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1105) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1106) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1107) static void ctx_header_from_global( void )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1108) {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1109)   struct strbuf   buf  = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1110)   struct variable head = { (unsigned char *)"header", { 0 }, DT_PATH }, *var = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1111)   char  *pheader = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1112) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1113)   var = lookup_global( lookup_global_section( config ), &head );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1114)   strbuf_selfdir( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1115) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1116)   if( var ) { strbuf_addf( &buf, "%s", (const char *)var->_v.vptr ); }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1117)   else      { strbuf_addf( &buf, "%s", ctx.page.header );            }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1118) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1119)   pheader = (char *)__sbrk( (int)buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1120)   sprintf( pheader, "%s", buf.buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1121)   strbuf_release( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1122)   ctx.page.header = (const char *)pheader;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1123) }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1124) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1125) static void ctx_header_from_repo( struct repo *repo )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1126) {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1127)   struct strbuf   buf  = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1128)   struct variable head = { (unsigned char *)"header", { 0 }, DT_PATH }, *var = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1129)   char  *pheader = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1130) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1131)   var = lookup( repo, &head );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1132)   strbuf_selfdir( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1133) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1134)   if( var ) { strbuf_addf( &buf, "%s", (const char *)var->_v.vptr ); }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1135)   else      { strbuf_addf( &buf, "%s", ctx.page.header );            }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1136) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1137)   pheader = (char *)__sbrk( (int)buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1138)   sprintf( pheader, "%s", buf.buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1139)   strbuf_release( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1140)   ctx.page.header = (const char *)pheader;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1141) }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1142) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1143) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1144) static void ctx_footer_from_global( void )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1145) {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1146)   struct strbuf   buf  = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1147)   struct variable foot = { (unsigned char *)"footer", { 0 }, DT_PATH }, *var = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1148)   char  *pfooter = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1149) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1150)   var = lookup_global( lookup_global_section( config ), &foot );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1151)   strbuf_selfdir( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1152) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1153)   if( var ) { strbuf_addf( &buf, "%s", (const char *)var->_v.vptr ); }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1154)   else      { strbuf_addf( &buf, "%s", ctx.page.footer );            }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1155) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1156)   pfooter = (char *)__sbrk( (int)buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1157)   sprintf( pfooter, "%s", buf.buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1158)   strbuf_release( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1159)   ctx.page.footer = (const char *)pfooter;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1160) }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1161) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1162) static void ctx_footer_from_repo( struct repo *repo )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1163) {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1164)   struct strbuf   buf  = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1165)   struct variable foot = { (unsigned char *)"footer", { 0 }, DT_PATH }, *var = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1166)   char  *pfooter = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1167) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1168)   var = lookup( repo, &foot );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1169)   strbuf_selfdir( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1170) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1171)   if( var ) { strbuf_addf( &buf, "%s", (const char *)var->_v.vptr ); }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1172)   else      { strbuf_addf( &buf, "%s", ctx.page.footer );            }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1173) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1174)   pfooter = (char *)__sbrk( (int)buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1175)   sprintf( pfooter, "%s", buf.buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1176)   strbuf_release( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1177)   ctx.page.footer = (const char *)pfooter;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1178) }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1179) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1180) 
c7693c71 (kx 2023-04-12 19:21:06 +0300 1181) static char name[PATH_MAX] = { 0 };
c7693c71 (kx 2023-04-12 19:21:06 +0300 1182) static char repo_root[PATH_MAX] = { 0 };
c7693c71 (kx 2023-04-12 19:21:06 +0300 1183) static char relative_path[PATH_MAX] = { 0 };
c7693c71 (kx 2023-04-12 19:21:06 +0300 1184) 
c7693c71 (kx 2023-04-12 19:21:06 +0300 1185) static char try[PATH_MAX] = { 0 };
c7693c71 (kx 2023-04-12 19:21:06 +0300 1186) 
c7693c71 (kx 2023-04-12 19:21:06 +0300 1187) static struct repo *ctx_repo_name( void )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1188) {
c7693c71 (kx 2023-04-12 19:21:06 +0300 1189)   struct repo *repo = NULL;
c7693c71 (kx 2023-04-12 19:21:06 +0300 1190)   char *s, *p = NULL, *n, *path, *path_info;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1191)   int   len = 0;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1192) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1193)   if( strcmp( "/", ctx.env.path_info ) )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1194)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1195)     path_info = xstrdup( ctx.env.path_info );
c7693c71 (kx 2023-04-12 19:21:06 +0300 1196)     s = path_info;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1197) 
c7693c71 (kx 2023-04-12 19:21:06 +0300 1198)     while( *s )
c7693c71 (kx 2023-04-12 19:21:06 +0300 1199)     {
c7693c71 (kx 2023-04-12 19:21:06 +0300 1200)       while( *s && is_dir_sep( *s ) )
c7693c71 (kx 2023-04-12 19:21:06 +0300 1201)         ++s;
c7693c71 (kx 2023-04-12 19:21:06 +0300 1202)       n = p = s;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1203) 
c7693c71 (kx 2023-04-12 19:21:06 +0300 1204)       while( *p && !is_dir_sep( *p ) )
c7693c71 (kx 2023-04-12 19:21:06 +0300 1205)         ++p;
c7693c71 (kx 2023-04-12 19:21:06 +0300 1206)       if( *p )
c7693c71 (kx 2023-04-12 19:21:06 +0300 1207)       {
c7693c71 (kx 2023-04-12 19:21:06 +0300 1208)         *p = '\0'; s = ++p;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1209) 
c7693c71 (kx 2023-04-12 19:21:06 +0300 1210)         /****************************************************************
c7693c71 (kx 2023-04-12 19:21:06 +0300 1211)           The repo name can be given as a relative path in the git-root:
c7693c71 (kx 2023-04-12 19:21:06 +0300 1212)          */
c7693c71 (kx 2023-04-12 19:21:06 +0300 1213)         if( repo_root[0] )
c7693c71 (kx 2023-04-12 19:21:06 +0300 1214)         {
c7693c71 (kx 2023-04-12 19:21:06 +0300 1215)           sprintf( try, "%s", repo_root );
c7693c71 (kx 2023-04-12 19:21:06 +0300 1216)           strcat( try, "/" );
c7693c71 (kx 2023-04-12 19:21:06 +0300 1217)           strcat( try, n );
c7693c71 (kx 2023-04-12 19:21:06 +0300 1218)         }
c7693c71 (kx 2023-04-12 19:21:06 +0300 1219)         else
c7693c71 (kx 2023-04-12 19:21:06 +0300 1220)         {
c7693c71 (kx 2023-04-12 19:21:06 +0300 1221)           sprintf( try, "%s", n );
c7693c71 (kx 2023-04-12 19:21:06 +0300 1222)         }
c7693c71 (kx 2023-04-12 19:21:06 +0300 1223) 
c7693c71 (kx 2023-04-12 19:21:06 +0300 1224)         if( (repo = lookup_repo( config, try )) )
c7693c71 (kx 2023-04-12 19:21:06 +0300 1225)         {
c7693c71 (kx 2023-04-12 19:21:06 +0300 1226)           sprintf( name, "%s", try );
c7693c71 (kx 2023-04-12 19:21:06 +0300 1227)           {
c7693c71 (kx 2023-04-12 19:21:06 +0300 1228)             char *rr = strstr( repo_root, try );
c7693c71 (kx 2023-04-12 19:21:06 +0300 1229)             if( rr )
c7693c71 (kx 2023-04-12 19:21:06 +0300 1230)               *rr = '\0';
c7693c71 (kx 2023-04-12 19:21:06 +0300 1231)             else
c7693c71 (kx 2023-04-12 19:21:06 +0300 1232)               repo_root[0] = '\0';
c7693c71 (kx 2023-04-12 19:21:06 +0300 1233)           }
c7693c71 (kx 2023-04-12 19:21:06 +0300 1234)           break;
c7693c71 (kx 2023-04-12 19:21:06 +0300 1235)         }
c7693c71 (kx 2023-04-12 19:21:06 +0300 1236)         else
c7693c71 (kx 2023-04-12 19:21:06 +0300 1237)         {
c7693c71 (kx 2023-04-12 19:21:06 +0300 1238)           if( repo_root[0] )
c7693c71 (kx 2023-04-12 19:21:06 +0300 1239)             strcat( repo_root, "/" );
c7693c71 (kx 2023-04-12 19:21:06 +0300 1240)           strcat( repo_root, n );
c7693c71 (kx 2023-04-12 19:21:06 +0300 1241)         }
c7693c71 (kx 2023-04-12 19:21:06 +0300 1242)       }
c7693c71 (kx 2023-04-12 19:21:06 +0300 1243)       else
c7693c71 (kx 2023-04-12 19:21:06 +0300 1244)         s = p;
c7693c71 (kx 2023-04-12 19:21:06 +0300 1245)     }
c7693c71 (kx 2023-04-12 19:21:06 +0300 1246) 
c7693c71 (kx 2023-04-12 19:21:06 +0300 1247)     ctx.repo.name = (const char *)&name[0];
c7693c71 (kx 2023-04-12 19:21:06 +0300 1248)     ctx.repo.repo_root = (const char *)&repo_root[0];
c7693c71 (kx 2023-04-12 19:21:06 +0300 1249) 
c7693c71 (kx 2023-04-12 19:21:06 +0300 1250)     path = p;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1251) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1252)     if( *path )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1253)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1254)       len = (int)strlen( path );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1255) 
c7693c71 (kx 2023-04-12 19:21:06 +0300 1256)       if( path[len-1] =='/' ) { path[len-1] = '\0'; --len; }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1257)       len += 1;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1258) 
c7693c71 (kx 2023-04-12 19:21:06 +0300 1259)       sprintf( relative_path, "%s", path );
c7693c71 (kx 2023-04-12 19:21:06 +0300 1260)       ctx.repo.relative_path = (const char *)&relative_path[0];
bfc1508d (kx 2023-03-24 03:55:33 +0300 1261)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1262) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1263)     free( path_info );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1264)   }
c7693c71 (kx 2023-04-12 19:21:06 +0300 1265) 
c7693c71 (kx 2023-04-12 19:21:06 +0300 1266)   return repo;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1267) }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1268) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1269) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1270) /*************************************************************
bfc1508d (kx 2023-03-24 03:55:33 +0300 1271)   Get integer value of query parameter 'name' and remove this
bfc1508d (kx 2023-03-24 03:55:33 +0300 1272)   parameter 'name=..' from ctx.env.query_string.
bfc1508d (kx 2023-03-24 03:55:33 +0300 1273)  */
bfc1508d (kx 2023-03-24 03:55:33 +0300 1274) int ctx_grab_int_query_param( const char *name )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1275) {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1276)   char *pofs = NULL, *query_string, *s = (char *)ctx.env.query_string;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1277)   int   ret = 0, len = 0;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1278) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1279)   if( !name || !*name ) return ret;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1280) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1281)   if( s && *s && (pofs = strstr( s, name )) )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1282)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1283)     char *rem, *p, *val = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1284)     struct strbuf buf = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1285) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1286)     p = pofs;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1287) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1288)     /* move to end of 'ofs=val' declaration: */
bfc1508d (kx 2023-03-24 03:55:33 +0300 1289)     while( *p && *p != '&' && *p != '=' ) ++p;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1290)     if( *p == '=' ) { val = ++p; while( *p && *p != '&' ) ++p; }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1291)     if( *p ) { *p = '\0'; rem = ++p; }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1292)     else
bfc1508d (kx 2023-03-24 03:55:33 +0300 1293)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1294)       rem = p;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1295)       if( s < pofs && (pofs[-1] == '&' || pofs[-1] == '=') ) --pofs;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1296)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1297) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1298)     /* fill buffer: */
bfc1508d (kx 2023-03-24 03:55:33 +0300 1299)     while( s < pofs ) { strbuf_addch( &buf, *s ); ++s; }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1300)     s = rem;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1301)     while( *s ) { strbuf_addch( &buf, *s ); ++s; }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1302)     strbuf_addch( &buf, '\0' );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1303) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1304)     /* get value: */
bfc1508d (kx 2023-03-24 03:55:33 +0300 1305)     if( val && *val ) { ret = atoi( val ); }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1306)     else              { ret = 0;           }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1307) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1308)     len = (int)buf.len;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1309)     query_string = (char *)__sbrk( len );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1310)     memcpy( (void *)query_string, (const void *)buf.buf, (size_t)len );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1311)     strbuf_release( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1312)     ctx.env.query_string = (const char *)query_string;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1313)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1314) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1315)   return ret;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1316) }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1317) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1318) /***************************************************************
bfc1508d (kx 2023-03-24 03:55:33 +0300 1319)   Rmove parametr with specified 'name=...' fom query string and
bfc1508d (kx 2023-03-24 03:55:33 +0300 1320)   return modified query string allocated in context _mem[].
bfc1508d (kx 2023-03-24 03:55:33 +0300 1321)  */
bfc1508d (kx 2023-03-24 03:55:33 +0300 1322) const char *ctx_remove_query_param( const char *query_string, const char *name )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1323) {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1324)   char *pofs = NULL, *query = NULL, *s = (char *)query_string;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1325)   int len = 0;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1326) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1327)   if( !name || !*name ) return (const char *)query;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1328) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1329)   if( s && *s && (pofs = strstr( s, name )) )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1330)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1331)     char *rem, *p;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1332)     struct strbuf buf = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1333) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1334)     p = pofs;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1335) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1336)     /* move to end of 'ofs=val' declaration: */
bfc1508d (kx 2023-03-24 03:55:33 +0300 1337)     while( *p && *p != '&' && *p != '=' ) ++p;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1338)     if( *p == '=' ) { while( *p && *p != '&' ) ++p; }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1339)     if( *p ) { *p = '\0'; rem = ++p; }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1340)     else
bfc1508d (kx 2023-03-24 03:55:33 +0300 1341)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1342)       rem = p;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1343)       if( s < pofs && (pofs[-1] == '&' || pofs[-1] == '=') ) --pofs;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1344)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1345) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1346)     /* fill buffer: */
bfc1508d (kx 2023-03-24 03:55:33 +0300 1347)     while( s < pofs ) { strbuf_addch( &buf, *s ); ++s; }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1348)     s = rem;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1349)     while( *s ) { strbuf_addch( &buf, *s ); ++s; }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1350)     strbuf_addch( &buf, '\0' );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1351) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1352)     len = (int)buf.len;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1353)     query = (char *)__sbrk( len );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1354)     memcpy( (void *)query, (const void *)buf.buf, (size_t)len );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1355)     strbuf_release( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1356)     return (const char *)query;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1357)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1358) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1359)   return (const char *)query;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1360) }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1361) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1362) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1363) static void ctx_search_placeholder( void )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1364) {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1365)   struct strbuf buf = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1366)   char  *revision;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1367)   int    len;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1368) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1369)   if( !strcmp( ctx.vars.page_type, ptype_repo ) )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1370)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1371)     if( ctx.query.rev )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1372)       strbuf_addf( &buf, "%d", ctx.query.rev );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1373)     else
bfc1508d (kx 2023-03-24 03:55:33 +0300 1374)       strbuf_addf( &buf, "%d", ctx.repo.info.revision );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1375) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1376)     len = (int)strlen( buf.buf ) + 1;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1377)     revision = (char *)__sbrk( len );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1378)     memcpy( (void *)revision, (const void *)buf.buf, (size_t)len );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1379)     strbuf_release( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1380) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1381)     ctx.repo.search_placeholder = (const char *)revision;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1382)     /* ctx.repo.search_placeholder = "HEAD"; */
bfc1508d (kx 2023-03-24 03:55:33 +0300 1383)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1384) }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1385) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1386) static void ctx_relative_html( void )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1387) {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1388)   struct strbuf buf  = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1389)   char  *relative_html;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1390)   int    len;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1391) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1392)   if( !strcmp( ctx.vars.page_type, ptype_repolist ) )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1393)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1394)     if( ctx.env.http_host && *ctx.env.http_host )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1395)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1396)       strbuf_addf( &buf, "<a class='base' href='/'>%s</a>/", ctx.env.http_host );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1397)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1398)     else if( ctx.env.server_name && *ctx.env.server_name )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1399)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1400)       strbuf_addf( &buf, "<a class='base' href='/'>%s</a>/", ctx.env.server_name );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1401)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1402)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1403)   else if( !strcmp( ctx.vars.page_type, ptype_repo ) )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1404)   {
c7693c71 (kx 2023-04-12 19:21:06 +0300 1405)     if( ctx.repo.name && *ctx.repo.name && ctx.repo.info.kind != KIND_UNKNOWN  )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1406)     {
c7693c71 (kx 2023-04-12 19:21:06 +0300 1407)       if( ctx.repo.repo_root && *ctx.repo.repo_root )
c7693c71 (kx 2023-04-12 19:21:06 +0300 1408)         strbuf_addf( &buf, "<a class='base' href='/%s/%s/'>%s/%s</a>/", ctx.repo.repo_root, ctx.repo.name, ctx.repo.repo_root, ctx.repo.name );
c7693c71 (kx 2023-04-12 19:21:06 +0300 1409)       else
c7693c71 (kx 2023-04-12 19:21:06 +0300 1410)         strbuf_addf( &buf, "<a class='base' href='/%s/'>%s</a>/", ctx.repo.name, ctx.repo.name );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1411)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1412)     if( ctx.repo.relative_path && *ctx.repo.relative_path && ctx.repo.relative_info.kind != KIND_UNKNOWN )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1413)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1414)       char   *p, *s, *rem;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1415)       int     msize;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1416)       char   *path, *href;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1417)       size_t  length;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1418) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1419)       length = strlen( ctx.repo.relative_path ) + 1;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1420)       msize = (int)strlen(ctx.repo.name) + (int)strlen(ctx.repo.relative_path) + 4; /* '/' repo.name '/' relative_path '/' + '\0' */
bfc1508d (kx 2023-03-24 03:55:33 +0300 1421) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1422)       href = (char *)__sbrk( msize );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1423)       sprintf( href, "/%s/", ctx.repo.name );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1424) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1425)       path = (char *)__sbrk( msize );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1426)       memcpy( (void *)path, (const void *)ctx.repo.relative_path, length );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1427) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1428)       p = s = path;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1429)       while( *p && !is_dir_sep( *p ) ) ++p;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1430)       if( *p ) { *p = '\0'; rem = ++p; }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1431)       else     { rem = p; }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1432)       strcat( href, s ); strcat( href, "/" );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1433) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1434)       if( !strcmp( s, ctx.repo.trunk )    ||
bfc1508d (kx 2023-03-24 03:55:33 +0300 1435)           !strcmp( s, ctx.repo.branches ) ||
bfc1508d (kx 2023-03-24 03:55:33 +0300 1436)           !strcmp( s, ctx.repo.tags )       )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1437)       {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1438)         strbuf_addf( &buf, "<a class='base' href='%s'>%s</a>/", href, s );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1439)       }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1440)       else
bfc1508d (kx 2023-03-24 03:55:33 +0300 1441)       {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1442)         strbuf_addf( &buf, "<a class='relative' href='%s'>%s</a>/", href, s );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1443)       }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1444) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1445)       s = rem;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1446)       while( *s )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1447)       {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1448)         p = s;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1449)         while( *p && !is_dir_sep( *p ) ) ++p;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1450)         if( *p ) { *p = '\0'; rem = ++p; }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1451)         else     { rem = p; }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1452)         strcat( href, s ); strcat( href, "/" );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1453)         strbuf_addf( &buf, "<a class='relative' href='%s'>%s</a>/", href, s );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1454)         s = rem;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1455)       }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1456) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1457)       if( ctx.repo.relative_info.kind == KIND_FILE )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1458)         strbuf_trim_trailing_dir_sep( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1459) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1460)       ctx.repo.relative_href = (const char *)href;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1461) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1462)       (void)__sbrk( - msize ); /* free ctx memory alocated for path only */
bfc1508d (kx 2023-03-24 03:55:33 +0300 1463)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1464)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1465) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1466)   len = (int)strlen( buf.buf ) + 1;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1467)   relative_html = (char *)__sbrk( len );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1468)   memcpy( (void *)relative_html, (const void *)buf.buf, (size_t)len );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1469)   strbuf_release( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1470)   ctx.repo.relative_html = (const char *)relative_html;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1471) }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1472) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1473) static void ctx_check_query_uri( int replace_query_string )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1474) {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1475)   /*
bfc1508d (kx 2023-03-24 03:55:33 +0300 1476)     Nginx passed QUERY_STRING for all cgi engines by: {fastcgi, scgi, uwsgi}_params.
bfc1508d (kx 2023-03-24 03:55:33 +0300 1477)     But PATH_INFO passed onlyfor UWSGI by uwsgi_params.
bfc1508d (kx 2023-03-24 03:55:33 +0300 1478)    */
bfc1508d (kx 2023-03-24 03:55:33 +0300 1479)   if( !ctx.env.path_info && ctx.env.request_uri && *ctx.env.request_uri )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1480)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1481)     char *path_info = NULL, *query_string = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1482)     char *p, *path, *query = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1483)     int   len;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1484) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1485)     p = path = (char *)ctx.env.request_uri;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1486) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1487)     while( *p && *p != '?' ) ++p;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1488)     if( *p == '?' ) { *p = '\0'; query = ++p; }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1489) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1490)     len = strlen( path ) + 1;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1491)     path_info = (char *)__sbrk( len );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1492)     memcpy( (void *)path_info, (const void *)path, (size_t)len );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1493)     ctx.env.path_info = (const char *)path_info;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1494) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1495)     if( query && *query && replace_query_string )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1496)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1497)       len = strlen( query ) + 1;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1498)       query_string = (char *)__sbrk( len );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1499)       memcpy( (void *)query_string, (const void *)query, (size_t)len );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1500)       ctx.env.query_string = (const char *)query_string;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1501)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1502)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1503) }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1504) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1505) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1506) static void querystring_cb( const char *name, const char *value )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1507) {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1508)   char *val;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1509)   int   len;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1510) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1511)   if( !value )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1512)     value = "";
bfc1508d (kx 2023-03-24 03:55:33 +0300 1513) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1514)   if( !strcmp( name, "rev" ) )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1515)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1516)     len = (int)strlen( value ) + 1;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1517)     val = (char *)__sbrk( len );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1518)     memcpy( (void *)val, (const void *)value, (size_t)len );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1519)     ctx.query.revision = (const char *)val;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1520)     if( !strcasecmp( val, "HEAD" ) )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1521)       ctx.query.rev = 0;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1522)     else
bfc1508d (kx 2023-03-24 03:55:33 +0300 1523)       ctx.query.rev = atoi( val );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1524)     /*****************************************************************************
bfc1508d (kx 2023-03-24 03:55:33 +0300 1525)       NOTE:
bfc1508d (kx 2023-03-24 03:55:33 +0300 1526)       ====
bfc1508d (kx 2023-03-24 03:55:33 +0300 1527)         If we will parse another string values of SVN revision such as
bfc1508d (kx 2023-03-24 03:55:33 +0300 1528)         'BASE', 'COMMITED', 'PREV' then we have to call http_parse_querystring()
bfc1508d (kx 2023-03-24 03:55:33 +0300 1529)         strongly after calling csvn_rpath_info() or ctx_relative_html() because
bfc1508d (kx 2023-03-24 03:55:33 +0300 1530)         the structs ctx.repo.info and ctx.repo.relative_info should be completed
bfc1508d (kx 2023-03-24 03:55:33 +0300 1531)         before parsing special SVN revision names.
bfc1508d (kx 2023-03-24 03:55:33 +0300 1532) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1533)         Revision at start of the date '{' DATE '}' we will not support.
bfc1508d (kx 2023-03-24 03:55:33 +0300 1534)      *****************************************************************************/
bfc1508d (kx 2023-03-24 03:55:33 +0300 1535)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1536)   else if( !strcmp( name, "op" ) )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1537)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1538)     len = (int)strlen( value ) + 1;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1539)     val = (char *)__sbrk( len );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1540)     memcpy( (void *)val, (const void *)value, (size_t)len );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1541)     ctx.query.operation = (const char *)val;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1542)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1543)   else if( !strcmp( name, "search" ) )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1544)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1545)     len = (int)strlen( value ) + 1;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1546)     val = (char *)__sbrk( len );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1547)     memcpy( (void *)val, (const void *)value, (size_t)len );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1548)     ctx.query.search = (const char *)val;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1549)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1550) /*
bfc1508d (kx 2023-03-24 03:55:33 +0300 1551)   else if( another parameter )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1552)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1553)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1554)   ...
bfc1508d (kx 2023-03-24 03:55:33 +0300 1555)  */
bfc1508d (kx 2023-03-24 03:55:33 +0300 1556)   /* NOTE: Do not parse 'ofs=' parameter! */
bfc1508d (kx 2023-03-24 03:55:33 +0300 1557) }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1558) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1559) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1560) void csvn_parse_query( void )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1561) {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1562)   char *path_info = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1563) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1564)   get_selfdir();
bfc1508d (kx 2023-03-24 03:55:33 +0300 1565) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1566)   ctx_check_query_uri( 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1567) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1568)   path_info = xstrdup( ctx.env.path_info );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1569) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1570)   ctx.query.ofs = ctx_grab_int_query_param( "ofs" );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1571) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1572)   if( path_info )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1573)   {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1574)     if( !strcmp( "/", path_info ) )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1575)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1576)       ctx_page_size_from_global();
bfc1508d (kx 2023-03-24 03:55:33 +0300 1577)       ctx_repo_dirs_from_global();
bfc1508d (kx 2023-03-24 03:55:33 +0300 1578)       ctx_site_vars_from_global();
bfc1508d (kx 2023-03-24 03:55:33 +0300 1579)       ctx_promo_vars_from_global();
bfc1508d (kx 2023-03-24 03:55:33 +0300 1580)       ctx_header_from_global();
bfc1508d (kx 2023-03-24 03:55:33 +0300 1581)       ctx_footer_from_global();
bfc1508d (kx 2023-03-24 03:55:33 +0300 1582)       ctx_num_of_repos();
bfc1508d (kx 2023-03-24 03:55:33 +0300 1583)       ctx_repolist_status_line();
bfc1508d (kx 2023-03-24 03:55:33 +0300 1584)       ctx_repolist_menu();
bfc1508d (kx 2023-03-24 03:55:33 +0300 1585)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1586)     else
bfc1508d (kx 2023-03-24 03:55:33 +0300 1587)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1588)       struct repo *repo = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1589) 
c7693c71 (kx 2023-04-12 19:21:06 +0300 1590)       repo = ctx_repo_name();
bfc1508d (kx 2023-03-24 03:55:33 +0300 1591)       if( repo )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1592)       {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1593)         ctx_page_size_from_repo( repo );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1594)         ctx_repo_dirs_from_repo( repo );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1595)         ctx_site_vars_from_repo( repo );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1596)         ctx_promo_vars_from_repo( repo );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1597)         ctx_header_from_repo( repo );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1598)         ctx_footer_from_repo( repo );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1599)         ctx.vars.page_type = ptype_repo;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1600) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1601)         csvn_repo_info( &ctx.repo.info, 0 );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1602)         if( ctx.repo.relative_path )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1603)           csvn_rpath_info( &ctx.repo.relative_info, ctx.repo.relative_path, 0 );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1604)         else
bfc1508d (kx 2023-03-24 03:55:33 +0300 1605)           memcpy( (void *)&ctx.repo.relative_info, (const void *)&ctx.repo.info, sizeof( struct csvn_info ) );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1606) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1607)         csvn_repo_branches_number( &ctx.repo );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1608)         csvn_repo_tags_number( &ctx.repo );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1609)         ctx_repo_status_line( &ctx.repo );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1610)         ctx_repo_menu( &ctx.repo );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1611)       }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1612)       else
bfc1508d (kx 2023-03-24 03:55:33 +0300 1613)       {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1614)         ctx_page_size_from_global();
bfc1508d (kx 2023-03-24 03:55:33 +0300 1615)         ctx_repo_dirs_from_global();
bfc1508d (kx 2023-03-24 03:55:33 +0300 1616)         ctx_header_from_global();
bfc1508d (kx 2023-03-24 03:55:33 +0300 1617)         ctx_footer_from_global();
bfc1508d (kx 2023-03-24 03:55:33 +0300 1618) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1619)         ctx.page.status = 404;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1620)         ctx.page.status_message = "Page not found";
bfc1508d (kx 2023-03-24 03:55:33 +0300 1621) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1622)         ctx.vars.title = "404";
bfc1508d (kx 2023-03-24 03:55:33 +0300 1623)         {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1624)           struct strbuf  buf = STRBUF_INIT;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1625)           char  *stmsg = NULL;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1626) 
c7693c71 (kx 2023-04-12 19:21:06 +0300 1627)           /**************************************************************************
c7693c71 (kx 2023-04-12 19:21:06 +0300 1628)             We slipped to the end of PATH_INFO when we were looking for a repository
c7693c71 (kx 2023-04-12 19:21:06 +0300 1629)             and now we printout the repo-root:
c7693c71 (kx 2023-04-12 19:21:06 +0300 1630)            */
c7693c71 (kx 2023-04-12 19:21:06 +0300 1631)           strbuf_addf( &buf, "Subversion Repository '%s' not found.", ctx.repo.repo_root );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1632)           stmsg = (char *)__sbrk( (int)buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1633)           memcpy( (void *)stmsg, (const void *)buf.buf, buf.len + 1 );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1634)           strbuf_release( &buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1635)           ctx.vars.description = (const char *)stmsg;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1636)         }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1637)       }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1638) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1639)       ctx_num_of_repos();
bfc1508d (kx 2023-03-24 03:55:33 +0300 1640)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1641) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1642)     ctx_relative_html();
bfc1508d (kx 2023-03-24 03:55:33 +0300 1643)     http_parse_querystring( ctx.env.query_string, querystring_cb );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1644)     if( ctx.query.rev < 1 )
bfc1508d (kx 2023-03-24 03:55:33 +0300 1645)     {
bfc1508d (kx 2023-03-24 03:55:33 +0300 1646)       (void)ctx_grab_int_query_param( "rev" );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1647)       ctx.query.rev = 0;
bfc1508d (kx 2023-03-24 03:55:33 +0300 1648)     }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1649)     ctx_search_placeholder();
bfc1508d (kx 2023-03-24 03:55:33 +0300 1650) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1651)     csvn_svn_version( &ctx.vers );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1652)     csvn_nginx_version( &ctx.vers );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1653) 
bfc1508d (kx 2023-03-24 03:55:33 +0300 1654)     free( path_info );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1655)   }
bfc1508d (kx 2023-03-24 03:55:33 +0300 1656) }