summaryrefslogtreecommitdiffabout
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--Makefile11
-rw-r--r--cgit.c2
2 files changed, 8 insertions, 5 deletions
diff --git a/Makefile b/Makefile
index a36eede..3d8edb8 100644
--- a/Makefile
+++ b/Makefile
@@ -1,80 +1,83 @@
CGIT_VERSION = 0.4
prefix = /var/www/htdocs/cgit
SHA1_HEADER = <openssl/sha.h>
-
CACHE_ROOT = /var/cache/cgit
+CGIT_CONFIG = /etc/cgitrc
+
EXTLIBS = git/libgit.a git/xdiff/lib.a -lz -lcrypto
OBJECTS = shared.o cache.o parsing.o html.o ui-shared.o ui-repolist.o \
ui-summary.o ui-log.o ui-view.o ui-tree.o ui-commit.o ui-diff.o \
ui-snapshot.o ui-blob.o
CFLAGS += -Wall
ifdef DEBUG
CFLAGS += -g
endif
-CFLAGS += -Igit -DSHA1_HEADER='$(SHA1_HEADER)'
+CFLAGS += -Igit
+CFLAGS += -DSHA1_HEADER='$(SHA1_HEADER)'
+CFLAGS += -DCGIT_VERSION='"$(CGIT_VERSION)"'
+CFLAGS += -DCGIT_CONFIG='"$(CGIT_CONFIG)"'
#
# If make is run on a nongit platform, we need to get the git sources as a tarball.
# But there is currently no recent enough tarball available on kernel.org, so download
# a zipfile from hjemli.net instead
#
GITVER = $(shell git version 2>/dev/null || echo nogit)
ifeq ($(GITVER),nogit)
GITURL = http://hjemli.net/git/git/snapshot/?id=v1.5.2-rc2
INITGIT = test -e git/git.c || (curl "$(GITURL)" > tmp.zip && unzip tmp.zip)
else
INITGIT = ./submodules.sh -i
endif
#
# basic build rules
#
all: cgit
cgit: cgit.c cgit.h $(OBJECTS)
- $(CC) $(CFLAGS) -DCGIT_VERSION='"$(CGIT_VERSION)"' cgit.c -o cgit \
- $(OBJECTS) $(EXTLIBS)
+ $(CC) $(CFLAGS) cgit.c -o cgit $(OBJECTS) $(EXTLIBS)
$(OBJECTS): cgit.h git/libgit.a
git/libgit.a:
$(INITGIT)
$(MAKE) -C git
#
# phony targets
#
install: all clean-cache
mkdir -p $(prefix)
install cgit $(prefix)/cgit.cgi
install cgit.css $(prefix)/cgit.css
install add.png del.png $(prefix)/
clean-cgit:
rm -f cgit *.o
distclean-cgit: clean-cgit
git clean -d -x
clean-sub:
$(MAKE) -C git clean
distclean-sub: clean-sub
$(shell cd git && git clean -d -x)
clean-cache:
rm -rf $(CACHE_ROOT)/*
clean: clean-cgit clean-sub
distclean: distclean-cgit distclean-sub
.PHONY: all install clean clean-cgit clean-sub clean-cache \
distclean distclean-cgit distclean-sub
diff --git a/cgit.c b/cgit.c
index 1d7a83f..67ad103 100644
--- a/cgit.c
+++ b/cgit.c
@@ -118,143 +118,143 @@ static void cgit_print_repo_page(struct cacheitem *item)
cgit_print_view(cgit_query_sha1, cgit_query_path);
} else if (!strcmp(cgit_query_page, "diff")) {
cgit_print_diff(cgit_query_sha1, cgit_query_sha2, cgit_query_path);
} else {
cgit_print_error("Invalid request");
}
cgit_print_docend();
}
static void cgit_fill_cache(struct cacheitem *item, int use_cache)
{
static char buf[PATH_MAX];
int stdout2;
getcwd(buf, sizeof(buf));
item->st.st_mtime = time(NULL);
if (use_cache) {
stdout2 = chk_positive(dup(STDOUT_FILENO),
"Preserving STDOUT");
chk_zero(close(STDOUT_FILENO), "Closing STDOUT");
chk_positive(dup2(item->fd, STDOUT_FILENO), "Dup2(cachefile)");
}
if (cgit_query_repo)
cgit_print_repo_page(item);
else
cgit_print_repolist(item);
if (use_cache) {
chk_zero(close(STDOUT_FILENO), "Close redirected STDOUT");
chk_positive(dup2(stdout2, STDOUT_FILENO),
"Restoring original STDOUT");
chk_zero(close(stdout2), "Closing temporary STDOUT");
}
chdir(buf);
}
static void cgit_check_cache(struct cacheitem *item)
{
int i = 0;
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, 1);
cache_unlock(item);
} else {
cache_cancel_lock(item);
}
} else if (cache_expired(item) && cache_lock(item)) {
if (cache_expired(item)) {
cgit_fill_cache(item, 1);
cache_unlock(item);
} else {
cache_cancel_lock(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);
}
static void cgit_parse_args(int argc, const char **argv)
{
int i;
for (i = 1; i < argc; i++) {
if (!strncmp(argv[i], "--cache=", 8)) {
cgit_cache_root = xstrdup(argv[i]+8);
}
if (!strcmp(argv[i], "--nocache")) {
cgit_nocache = 1;
}
if (!strncmp(argv[i], "--query=", 8)) {
cgit_querystring = xstrdup(argv[i]+8);
}
if (!strncmp(argv[i], "--repo=", 7)) {
cgit_query_repo = xstrdup(argv[i]+7);
}
if (!strncmp(argv[i], "--page=", 7)) {
cgit_query_page = xstrdup(argv[i]+7);
}
if (!strncmp(argv[i], "--head=", 7)) {
cgit_query_head = xstrdup(argv[i]+7);
cgit_query_has_symref = 1;
}
if (!strncmp(argv[i], "--sha1=", 7)) {
cgit_query_sha1 = xstrdup(argv[i]+7);
cgit_query_has_sha1 = 1;
}
if (!strncmp(argv[i], "--ofs=", 6)) {
cgit_query_ofs = atoi(argv[i]+6);
}
}
}
int main(int argc, const char **argv)
{
struct cacheitem item;
htmlfd = STDOUT_FILENO;
item.st.st_mtime = time(NULL);
cgit_repolist.length = 0;
cgit_repolist.count = 0;
cgit_repolist.repos = NULL;
- cgit_read_config("/etc/cgitrc", cgit_global_config_cb);
+ cgit_read_config(CGIT_CONFIG, cgit_global_config_cb);
if (getenv("QUERY_STRING"))
cgit_querystring = xstrdup(getenv("QUERY_STRING"));
cgit_parse_args(argc, argv);
cgit_parse_query(cgit_querystring, cgit_querystring_cb);
if (!cgit_prepare_cache(&item))
return 0;
if (cgit_nocache) {
cgit_fill_cache(&item, 0);
} else {
cgit_check_cache(&item);
cgit_print_cache(&item);
}
return 0;
}