X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/0d169ada2ba81210ab1191a5f2212662e90db77e..74620f12e4f7e91cb0a0b4ca731e07272d1b65f6:/cgit.c?ds=sidebyside
diff --git a/cgit.c b/cgit.c
index 4c14f77..b3ff512 100644
--- a/cgit.c
+++ b/cgit.c
@@ -1,54 +1,47 @@
-#include "cgit.h"
-
-static const char cgit_doctype[] =
-"\n";
+/* cgit.c: cgi for the git scm
+ *
+ * Copyright (C) 2006 Lars Hjemli
+ *
+ * Licensed under GNU General Public License v2
+ * (see COPYING for full license text)
+ */
-static const char cgit_error[] =
-"
");
@@ -291,7 +189,7 @@ static void cgit_print_commit_shortlog(struct commit *commit)
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", time);
html_txt(buf);
html("| ");
- char *qry = fmt("h=%s", sha1_to_hex(commit->object.sha1));
+ char *qry = fmt("id=%s", sha1_to_hex(commit->object.sha1));
char *url = cgit_pageurl(cgit_query_repo, "view", qry);
html_link_open(url, NULL, NULL);
html_txt(subject);
@@ -346,18 +244,18 @@ static void cgit_print_object(char *hex)
unsigned long size;
if (get_sha1_hex(hex, sha1)){
- htmlf(cgit_error, "Bad hex value");
+ cgit_print_error(fmt("Bad hex value: %s", hex));
return;
}
if (sha1_object_info(sha1, type, NULL)){
- htmlf(cgit_error, "Bad object name");
+ cgit_print_error("Bad object name");
return;
}
buf = read_sha1_file(sha1, type, &size);
if (!buf) {
- htmlf(cgit_error, "Error reading object");
+ cgit_print_error("Error reading object");
return;
}
@@ -369,42 +267,88 @@ static void cgit_print_object(char *hex)
html("");
}
-static void cgit_print_repo_page()
+static void cgit_print_repo_page(struct cacheitem *item)
{
- if (chdir(cgit_query_repo) ||
- cgit_read_config(".git/info/cgit", cgit_repo_config_cb)) {
+ if (chdir(fmt("%s/%s", cgit_root, cgit_query_repo)) ||
+ cgit_read_config("info/cgit", cgit_repo_config_cb)) {
char *title = fmt("%s - %s", cgit_root_title, "Bad request");
- cgit_print_docstart(title);
+ cgit_print_docstart(title, item);
cgit_print_pageheader(title);
- htmlf(cgit_lib_error, "Unable to scan repository",
- strerror(errno));
+ cgit_print_error(fmt("Unable to scan repository: %s",
+ strerror(errno)));
cgit_print_docend();
return;
}
-
+ setenv("GIT_DIR", fmt("%s/%s", cgit_root, cgit_query_repo), 1);
char *title = fmt("%s - %s", cgit_repo_name, cgit_repo_desc);
- cgit_print_docstart(title);
+ cgit_print_docstart(title, item);
cgit_print_pageheader(title);
if (!cgit_query_page)
cgit_print_repo_summary();
else if (!strcmp(cgit_query_page, "log")) {
cgit_print_log(cgit_query_head, 0, 100);
} else if (!strcmp(cgit_query_page, "view")) {
- cgit_print_object(cgit_query_head);
+ cgit_print_object(cgit_query_sha1);
}
cgit_print_docend();
}
-int main(int argc, const char **argv)
+static void cgit_fill_cache(struct cacheitem *item)
{
- if (cgit_read_config("/etc/cgitrc", cgit_global_config_cb))
- die("Error reading config: %d %s", errno, strerror(errno));
-
- chdir(cgit_root);
- cgit_parse_query(getenv("QUERY_STRING"), cgit_querystring_cb);
+ htmlfd = item->fd;
+ item->st.st_mtime = time(NULL);
if (cgit_query_repo)
- cgit_print_repo_page();
+ cgit_print_repo_page(item);
else
- cgit_print_repolist();
+ cgit_print_repolist(item);
+}
+
+static void cgit_refresh_cache(struct cacheitem *item)
+{
+ int i = 0;
+
+ cache_prepare(item);
+ top:
+ if (++i > cgit_max_lock_attempts) {
+ die("cgit_refresh_cache: unable to lock %s: %s",
+ item->name, strerror(errno));
+ }
+ if (!cache_exist(item)) {
+ if (!cache_lock(item)) {
+ sleep(1);
+ goto top;
+ }
+ if (!cache_exist(item))
+ cgit_fill_cache(item);
+ cache_unlock(item);
+ } else if (cache_expired(item) && cache_lock(item)) {
+ if (cache_expired(item))
+ cgit_fill_cache(item);
+ cache_unlock(item);
+ }
+}
+
+static void cgit_print_cache(struct cacheitem *item)
+{
+ static char buf[4096];
+ ssize_t i;
+
+ int fd = open(item->name, O_RDONLY);
+ if (fd<0)
+ die("Unable to open cached file %s", item->name);
+
+ while((i=read(fd, buf, sizeof(buf))) > 0)
+ write(STDOUT_FILENO, buf, i);
+
+ close(fd);
+}
+
+int main(int argc, const char **argv)
+{
+ cgit_read_config("/etc/cgitrc", cgit_global_config_cb);
+ cgit_querystring = xstrdup(getenv("QUERY_STRING"));
+ cgit_parse_query(cgit_querystring, cgit_querystring_cb);
+ cgit_refresh_cache(&cacheitem);
+ cgit_print_cache(&cacheitem);
return 0;
}
|