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 = "© 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 ), ©right_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 ), ©right );
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, ©right_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, ©right );
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, " | <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 \n", commits.buf );
bfc1508d (kx 2023-03-24 03:55:33 +0300 1011) strbuf_addf( &buf, "<span class=\"las la-code-branch\"></span> %s \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, " | <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) }