summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorLars Hjemli2008-04-29 00:35:49 +0200
committerLars Hjemli2008-04-29 00:35:49 +0200
commit8062817885495b07cf70304c484e8f18c78ab2b5 (patch)
tree5cb5c13a176ba400dcc65d65cd5b03588b41686d
parent90f64ad96d2e4490d68db71554ebce7a54206f80 (diff)
downloadcgit-8062817885495b07cf70304c484e8f18c78ab2b5.tar
cgit-8062817885495b07cf70304c484e8f18c78ab2b5.tar.gz
cgit-8062817885495b07cf70304c484e8f18c78ab2b5.zip
Move included header-file out of repolist table
When the 'index-header' option is specified in cgitrc we used to print the included file content inside the repolist table, which is bad style. This commit makes the included file be printed before the table. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
-rw-r--r--ui-repolist.c9
1 files changed, 3 insertions, 6 deletions
diff --git a/ui-repolist.c b/ui-repolist.c
index 98009c0..200640c 100644
--- a/ui-repolist.c
+++ b/ui-repolist.c
@@ -61,12 +61,6 @@ int is_match(struct cgit_repo *repo)
void print_header(int columns)
{
- if (ctx.cfg.index_header) {
- htmlf("<tr class='nohover'><td colspan='%d' class='include-block'>",
- columns);
- html_include(ctx.cfg.index_header);
- html("</td></tr>");
- }
html("<tr class='nohover'>"
"<th class='left'>Name</th>"
"<th class='left'>Description</th>"
@@ -90,6 +84,9 @@ void cgit_print_repolist()
cgit_print_docstart(&ctx);
cgit_print_pageheader(&ctx);
+ if (ctx.cfg.index_header)
+ html_include(ctx.cfg.index_header);
+
html("<table summary='repository list' class='list nowrap'>");
for (i=0; i<cgit_repolist.count; i++) {
ctx.repo = &cgit_repolist.repos[i];
font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
/* cache.c: cache management
 *
 * Copyright (C) 2006 Lars Hjemli
 *
 * Licensed under GNU General Public License v2
 *   (see COPYING for full license text)
 */

#include "cgit.h"
#include "cache.h"

const int NOLOCK = -1;

char *cache_safe_filename(const char *unsafe)
{
	static char buf[4][PATH_MAX];
	static int bufidx;
	char *s;
	char c;

	bufidx++;
	bufidx &= 3;
	s = buf[bufidx];

	while(unsafe && (c = *unsafe++) != 0) {
		if (c == '/' || c == ' ' || c == '&' || c == '|' ||
		    c == '>' || c == '<' || c == '.')
			c = '_';
		*s++ = c;
	}
	*s = '\0';
	return buf[bufidx];
}

int cache_exist(struct cacheitem *item)
{
	if (stat(item->name, &item->st)) {
		item->st.st_mtime = 0;
		return 0;
	}
	return 1;
}

int cache_create_dirs()
{
	char *path;

	path = fmt("%s", ctx.cfg.cache_root);
	if (mkdir(path, S_IRWXU) && errno!=EEXIST)
		return 0;

	if (!ctx.repo)
		return 0;

	path = fmt("%s/%s", ctx.cfg.cache_root,
		   cache_safe_filename(ctx.repo->url));

	if (mkdir(path, S_IRWXU) && errno!=EEXIST)
		return 0;

	if (ctx.qry.page) {
		path = fmt("%s/%s/%s", ctx.cfg.cache_root,
			   cache_safe_filename(ctx.repo->url),
			   ctx.qry.page);
		if (mkdir(path, S_IRWXU) && errno!=EEXIST)
			return 0;
	}
	return 1;
}

int cache_refill_overdue(const char *lockfile)
{
	struct stat st;

	if (stat(lockfile, &st))
		return 0;
	else
		return (time(NULL) - st.st_mtime > ctx.cfg.cache_max_create_time);
}

int cache_lock(struct cacheitem *item)
{
	int i = 0;
	char *lockfile = xstrdup(fmt("%s.lock", item->name));

 top:
	if (++i > ctx.cfg.max_lock_attempts)
		die("cache_lock: unable to lock %s: %s",
		    item->name, strerror(errno));

       	item->fd = open(lockfile, O_WRONLY|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR);

	if (item->fd == NOLOCK && errno == ENOENT && cache_create_dirs())
		goto top;

	if (item->fd == NOLOCK && errno == EEXIST &&
	    cache_refill_overdue(lockfile) && !unlink(lockfile))
			goto top;

	free(lockfile);
	return (item->fd > 0);
}

int cache_unlock(struct cacheitem *item)
{
	close(item->fd);
	return (rename(fmt("%s.lock", item->name), item->name) == 0);
}

int cache_cancel_lock(struct cacheitem *item)
{
	return (unlink(fmt("%s.lock", item->name)) == 0);
}

int cache_expired(struct cacheitem *item)
{
	if (item->ttl < 0)
		return 0;
	return item->st.st_mtime + item->ttl * 60 < time(NULL);
}