summaryrefslogtreecommitdiffabout
authorLars Hjemli <hjemli@gmail.com>2006-12-16 12:55:58 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2006-12-16 12:55:58 (UTC)
commit7c849d94ec1cfecdec5a88d49f5af5c98f96ebca (patch) (unidiff)
tree294acaa3368cba880dcc74aac8fb95e22156be21
parent61245ad18545ab09b22e9fcce5e49d5d36bf8176 (diff)
downloadcgit-7c849d94ec1cfecdec5a88d49f5af5c98f96ebca.zip
cgit-7c849d94ec1cfecdec5a88d49f5af5c98f96ebca.tar.gz
cgit-7c849d94ec1cfecdec5a88d49f5af5c98f96ebca.tar.bz2
Allow relative paths for cgit_cache_root
Make sure we chdir(2) back to the original getcwd(2) when a page has been generated. Also, if the cgit_cache_root do not exist, try to create it. This is a feature intended to ease testing/debugging. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--cache.c4
-rw-r--r--cgit.c4
2 files changed, 8 insertions, 0 deletions
diff --git a/cache.c b/cache.c
index 39e63a5..91b89a6 100644
--- a/cache.c
+++ b/cache.c
@@ -24,48 +24,52 @@ void cache_prepare(struct cacheitem *item)
24 cgit_query_repo, cgit_query_page, 24 cgit_query_repo, cgit_query_page,
25 cgit_querystring)); 25 cgit_querystring));
26 if (cgit_query_has_symref) 26 if (cgit_query_has_symref)
27 item->ttl = cgit_cache_dynamic_ttl; 27 item->ttl = cgit_cache_dynamic_ttl;
28 else if (cgit_query_has_sha1) 28 else if (cgit_query_has_sha1)
29 item->ttl = cgit_cache_static_ttl; 29 item->ttl = cgit_cache_static_ttl;
30 else 30 else
31 item->ttl = cgit_cache_repo_ttl; 31 item->ttl = cgit_cache_repo_ttl;
32 } 32 }
33} 33}
34 34
35int cache_exist(struct cacheitem *item) 35int cache_exist(struct cacheitem *item)
36{ 36{
37 if (stat(item->name, &item->st)) { 37 if (stat(item->name, &item->st)) {
38 item->st.st_mtime = 0; 38 item->st.st_mtime = 0;
39 return 0; 39 return 0;
40 } 40 }
41 return 1; 41 return 1;
42} 42}
43 43
44int cache_create_dirs() 44int cache_create_dirs()
45{ 45{
46 char *path; 46 char *path;
47 47
48 path = fmt("%s", cgit_cache_root);
49 if (mkdir(path, S_IRWXU) && errno!=EEXIST)
50 return 0;
51
48 if (!cgit_query_repo) 52 if (!cgit_query_repo)
49 return 0; 53 return 0;
50 54
51 path = fmt("%s/%s", cgit_cache_root, cgit_query_repo); 55 path = fmt("%s/%s", cgit_cache_root, cgit_query_repo);
52 if (mkdir(path, S_IRWXU) && errno!=EEXIST) 56 if (mkdir(path, S_IRWXU) && errno!=EEXIST)
53 return 0; 57 return 0;
54 58
55 if (cgit_query_page) { 59 if (cgit_query_page) {
56 path = fmt("%s/%s/%s", cgit_cache_root, cgit_query_repo, 60 path = fmt("%s/%s/%s", cgit_cache_root, cgit_query_repo,
57 cgit_query_page); 61 cgit_query_page);
58 if (mkdir(path, S_IRWXU) && errno!=EEXIST) 62 if (mkdir(path, S_IRWXU) && errno!=EEXIST)
59 return 0; 63 return 0;
60 } 64 }
61 return 1; 65 return 1;
62} 66}
63 67
64int cache_refill_overdue(const char *lockfile) 68int cache_refill_overdue(const char *lockfile)
65{ 69{
66 struct stat st; 70 struct stat st;
67 71
68 if (stat(lockfile, &st)) 72 if (stat(lockfile, &st))
69 return 0; 73 return 0;
70 else 74 else
71 return (time(NULL) - st.st_mtime > cgit_cache_max_create_time); 75 return (time(NULL) - st.st_mtime > cgit_cache_max_create_time);
diff --git a/cgit.c b/cgit.c
index 9dbc608..372b436 100644
--- a/cgit.c
+++ b/cgit.c
@@ -21,54 +21,58 @@ static void cgit_print_repo_page(struct cacheitem *item)
21 strerror(errno))); 21 strerror(errno)));
22 cgit_print_docend(); 22 cgit_print_docend();
23 return; 23 return;
24 } 24 }
25 setenv("GIT_DIR", fmt("%s/%s", cgit_root, cgit_query_repo), 1); 25 setenv("GIT_DIR", fmt("%s/%s", cgit_root, cgit_query_repo), 1);
26 char *title = fmt("%s - %s", cgit_repo_name, cgit_repo_desc); 26 char *title = fmt("%s - %s", cgit_repo_name, cgit_repo_desc);
27 cgit_print_docstart(title, item); 27 cgit_print_docstart(title, item);
28 cgit_print_pageheader(title); 28 cgit_print_pageheader(title);
29 if (!cgit_query_page) { 29 if (!cgit_query_page) {
30 cgit_print_summary(); 30 cgit_print_summary();
31 } else if (!strcmp(cgit_query_page, "log")) { 31 } else if (!strcmp(cgit_query_page, "log")) {
32 cgit_print_log(cgit_query_head, cgit_query_ofs, 100); 32 cgit_print_log(cgit_query_head, cgit_query_ofs, 100);
33 } else if (!strcmp(cgit_query_page, "tree")) { 33 } else if (!strcmp(cgit_query_page, "tree")) {
34 cgit_print_tree(cgit_query_sha1); 34 cgit_print_tree(cgit_query_sha1);
35 } else if (!strcmp(cgit_query_page, "commit")) { 35 } else if (!strcmp(cgit_query_page, "commit")) {
36 cgit_print_commit(cgit_query_sha1); 36 cgit_print_commit(cgit_query_sha1);
37 } else if (!strcmp(cgit_query_page, "view")) { 37 } else if (!strcmp(cgit_query_page, "view")) {
38 cgit_print_view(cgit_query_sha1); 38 cgit_print_view(cgit_query_sha1);
39 } 39 }
40 cgit_print_docend(); 40 cgit_print_docend();
41} 41}
42 42
43static void cgit_fill_cache(struct cacheitem *item) 43static void cgit_fill_cache(struct cacheitem *item)
44{ 44{
45 static char buf[PATH_MAX];
46
47 getcwd(buf, sizeof(buf));
45 htmlfd = item->fd; 48 htmlfd = item->fd;
46 item->st.st_mtime = time(NULL); 49 item->st.st_mtime = time(NULL);
47 if (cgit_query_repo) 50 if (cgit_query_repo)
48 cgit_print_repo_page(item); 51 cgit_print_repo_page(item);
49 else 52 else
50 cgit_print_repolist(item); 53 cgit_print_repolist(item);
54 chdir(buf);
51} 55}
52 56
53static void cgit_check_cache(struct cacheitem *item) 57static void cgit_check_cache(struct cacheitem *item)
54{ 58{
55 int i = 0; 59 int i = 0;
56 60
57 cache_prepare(item); 61 cache_prepare(item);
58 top: 62 top:
59 if (++i > cgit_max_lock_attempts) { 63 if (++i > cgit_max_lock_attempts) {
60 die("cgit_refresh_cache: unable to lock %s: %s", 64 die("cgit_refresh_cache: unable to lock %s: %s",
61 item->name, strerror(errno)); 65 item->name, strerror(errno));
62 } 66 }
63 if (!cache_exist(item)) { 67 if (!cache_exist(item)) {
64 if (!cache_lock(item)) { 68 if (!cache_lock(item)) {
65 sleep(1); 69 sleep(1);
66 goto top; 70 goto top;
67 } 71 }
68 if (!cache_exist(item)) { 72 if (!cache_exist(item)) {
69 cgit_fill_cache(item); 73 cgit_fill_cache(item);
70 cache_unlock(item); 74 cache_unlock(item);
71 } else { 75 } else {
72 cache_cancel_lock(item); 76 cache_cancel_lock(item);
73 } 77 }
74 } else if (cache_expired(item) && cache_lock(item)) { 78 } else if (cache_expired(item) && cache_lock(item)) {