|
diff --git a/Makefile b/Makefile index a36eede..3d8edb8 100644 --- a/ Makefile+++ b/ Makefile |
|
@@ -1,80 +1,83 @@ |
1 | CGIT_VERSION = 0.4 |
1 | CGIT_VERSION = 0.4 |
2 | |
2 | |
3 | prefix = /var/www/htdocs/cgit |
3 | prefix = /var/www/htdocs/cgit |
4 | |
4 | |
5 | SHA1_HEADER = <openssl/sha.h> |
5 | SHA1_HEADER = <openssl/sha.h> |
6 | |
| |
7 | CACHE_ROOT = /var/cache/cgit |
6 | CACHE_ROOT = /var/cache/cgit |
| |
7 | CGIT_CONFIG = /etc/cgitrc |
| |
8 | |
8 | EXTLIBS = git/libgit.a git/xdiff/lib.a -lz -lcrypto |
9 | EXTLIBS = git/libgit.a git/xdiff/lib.a -lz -lcrypto |
9 | OBJECTS = shared.o cache.o parsing.o html.o ui-shared.o ui-repolist.o \ |
10 | OBJECTS = shared.o cache.o parsing.o html.o ui-shared.o ui-repolist.o \ |
10 | ui-summary.o ui-log.o ui-view.o ui-tree.o ui-commit.o ui-diff.o \ |
11 | ui-summary.o ui-log.o ui-view.o ui-tree.o ui-commit.o ui-diff.o \ |
11 | ui-snapshot.o ui-blob.o |
12 | ui-snapshot.o ui-blob.o |
12 | |
13 | |
13 | CFLAGS += -Wall |
14 | CFLAGS += -Wall |
14 | |
15 | |
15 | ifdef DEBUG |
16 | ifdef DEBUG |
16 | CFLAGS += -g |
17 | CFLAGS += -g |
17 | endif |
18 | endif |
18 | |
19 | |
19 | CFLAGS += -Igit -DSHA1_HEADER='$(SHA1_HEADER)' |
20 | CFLAGS += -Igit |
| |
21 | CFLAGS += -DSHA1_HEADER='$(SHA1_HEADER)' |
| |
22 | CFLAGS += -DCGIT_VERSION='"$(CGIT_VERSION)"' |
| |
23 | CFLAGS += -DCGIT_CONFIG='"$(CGIT_CONFIG)"' |
20 | |
24 | |
21 | |
25 | |
22 | # |
26 | # |
23 | # If make is run on a nongit platform, we need to get the git sources as a tarball. |
27 | # If make is run on a nongit platform, we need to get the git sources as a tarball. |
24 | # But there is currently no recent enough tarball available on kernel.org, so download |
28 | # But there is currently no recent enough tarball available on kernel.org, so download |
25 | # a zipfile from hjemli.net instead |
29 | # a zipfile from hjemli.net instead |
26 | # |
30 | # |
27 | GITVER = $(shell git version 2>/dev/null || echo nogit) |
31 | GITVER = $(shell git version 2>/dev/null || echo nogit) |
28 | ifeq ($(GITVER),nogit) |
32 | ifeq ($(GITVER),nogit) |
29 | GITURL = http://hjemli.net/git/git/snapshot/?id=v1.5.2-rc2 |
33 | GITURL = http://hjemli.net/git/git/snapshot/?id=v1.5.2-rc2 |
30 | INITGIT = test -e git/git.c || (curl "$(GITURL)" > tmp.zip && unzip tmp.zip) |
34 | INITGIT = test -e git/git.c || (curl "$(GITURL)" > tmp.zip && unzip tmp.zip) |
31 | else |
35 | else |
32 | INITGIT = ./submodules.sh -i |
36 | INITGIT = ./submodules.sh -i |
33 | endif |
37 | endif |
34 | |
38 | |
35 | |
39 | |
36 | # |
40 | # |
37 | # basic build rules |
41 | # basic build rules |
38 | # |
42 | # |
39 | all: cgit |
43 | all: cgit |
40 | |
44 | |
41 | cgit: cgit.c cgit.h $(OBJECTS) |
45 | cgit: cgit.c cgit.h $(OBJECTS) |
42 | $(CC) $(CFLAGS) -DCGIT_VERSION='"$(CGIT_VERSION)"' cgit.c -o cgit \ |
46 | $(CC) $(CFLAGS) cgit.c -o cgit $(OBJECTS) $(EXTLIBS) |
43 | $(OBJECTS) $(EXTLIBS) |
| |
44 | |
47 | |
45 | $(OBJECTS): cgit.h git/libgit.a |
48 | $(OBJECTS): cgit.h git/libgit.a |
46 | |
49 | |
47 | git/libgit.a: |
50 | git/libgit.a: |
48 | $(INITGIT) |
51 | $(INITGIT) |
49 | $(MAKE) -C git |
52 | $(MAKE) -C git |
50 | |
53 | |
51 | # |
54 | # |
52 | # phony targets |
55 | # phony targets |
53 | # |
56 | # |
54 | install: all clean-cache |
57 | install: all clean-cache |
55 | mkdir -p $(prefix) |
58 | mkdir -p $(prefix) |
56 | install cgit $(prefix)/cgit.cgi |
59 | install cgit $(prefix)/cgit.cgi |
57 | install cgit.css $(prefix)/cgit.css |
60 | install cgit.css $(prefix)/cgit.css |
58 | install add.png del.png $(prefix)/ |
61 | install add.png del.png $(prefix)/ |
59 | |
62 | |
60 | clean-cgit: |
63 | clean-cgit: |
61 | rm -f cgit *.o |
64 | rm -f cgit *.o |
62 | |
65 | |
63 | distclean-cgit: clean-cgit |
66 | distclean-cgit: clean-cgit |
64 | git clean -d -x |
67 | git clean -d -x |
65 | |
68 | |
66 | clean-sub: |
69 | clean-sub: |
67 | $(MAKE) -C git clean |
70 | $(MAKE) -C git clean |
68 | |
71 | |
69 | distclean-sub: clean-sub |
72 | distclean-sub: clean-sub |
70 | $(shell cd git && git clean -d -x) |
73 | $(shell cd git && git clean -d -x) |
71 | |
74 | |
72 | clean-cache: |
75 | clean-cache: |
73 | rm -rf $(CACHE_ROOT)/* |
76 | rm -rf $(CACHE_ROOT)/* |
74 | |
77 | |
75 | clean: clean-cgit clean-sub |
78 | clean: clean-cgit clean-sub |
76 | |
79 | |
77 | distclean: distclean-cgit distclean-sub |
80 | distclean: distclean-cgit distclean-sub |
78 | |
81 | |
79 | .PHONY: all install clean clean-cgit clean-sub clean-cache \ |
82 | .PHONY: all install clean clean-cgit clean-sub clean-cache \ |
80 | distclean distclean-cgit distclean-sub |
83 | distclean distclean-cgit distclean-sub |
|
|
diff --git a/cgit.c b/cgit.c index 1d7a83f..67ad103 100644 --- a/ cgit.c+++ b/ cgit.c |
|
@@ -150,111 +150,111 @@ static void cgit_fill_cache(struct cacheitem *item, int use_cache) |
150 | "Restoring original STDOUT"); |
150 | "Restoring original STDOUT"); |
151 | chk_zero(close(stdout2), "Closing temporary STDOUT"); |
151 | chk_zero(close(stdout2), "Closing temporary STDOUT"); |
152 | } |
152 | } |
153 | |
153 | |
154 | chdir(buf); |
154 | chdir(buf); |
155 | } |
155 | } |
156 | |
156 | |
157 | static void cgit_check_cache(struct cacheitem *item) |
157 | static void cgit_check_cache(struct cacheitem *item) |
158 | { |
158 | { |
159 | int i = 0; |
159 | int i = 0; |
160 | |
160 | |
161 | top: |
161 | top: |
162 | if (++i > cgit_max_lock_attempts) { |
162 | if (++i > cgit_max_lock_attempts) { |
163 | die("cgit_refresh_cache: unable to lock %s: %s", |
163 | die("cgit_refresh_cache: unable to lock %s: %s", |
164 | item->name, strerror(errno)); |
164 | item->name, strerror(errno)); |
165 | } |
165 | } |
166 | if (!cache_exist(item)) { |
166 | if (!cache_exist(item)) { |
167 | if (!cache_lock(item)) { |
167 | if (!cache_lock(item)) { |
168 | sleep(1); |
168 | sleep(1); |
169 | goto top; |
169 | goto top; |
170 | } |
170 | } |
171 | if (!cache_exist(item)) { |
171 | if (!cache_exist(item)) { |
172 | cgit_fill_cache(item, 1); |
172 | cgit_fill_cache(item, 1); |
173 | cache_unlock(item); |
173 | cache_unlock(item); |
174 | } else { |
174 | } else { |
175 | cache_cancel_lock(item); |
175 | cache_cancel_lock(item); |
176 | } |
176 | } |
177 | } else if (cache_expired(item) && cache_lock(item)) { |
177 | } else if (cache_expired(item) && cache_lock(item)) { |
178 | if (cache_expired(item)) { |
178 | if (cache_expired(item)) { |
179 | cgit_fill_cache(item, 1); |
179 | cgit_fill_cache(item, 1); |
180 | cache_unlock(item); |
180 | cache_unlock(item); |
181 | } else { |
181 | } else { |
182 | cache_cancel_lock(item); |
182 | cache_cancel_lock(item); |
183 | } |
183 | } |
184 | } |
184 | } |
185 | } |
185 | } |
186 | |
186 | |
187 | static void cgit_print_cache(struct cacheitem *item) |
187 | static void cgit_print_cache(struct cacheitem *item) |
188 | { |
188 | { |
189 | static char buf[4096]; |
189 | static char buf[4096]; |
190 | ssize_t i; |
190 | ssize_t i; |
191 | |
191 | |
192 | int fd = open(item->name, O_RDONLY); |
192 | int fd = open(item->name, O_RDONLY); |
193 | if (fd<0) |
193 | if (fd<0) |
194 | die("Unable to open cached file %s", item->name); |
194 | die("Unable to open cached file %s", item->name); |
195 | |
195 | |
196 | while((i=read(fd, buf, sizeof(buf))) > 0) |
196 | while((i=read(fd, buf, sizeof(buf))) > 0) |
197 | write(STDOUT_FILENO, buf, i); |
197 | write(STDOUT_FILENO, buf, i); |
198 | |
198 | |
199 | close(fd); |
199 | close(fd); |
200 | } |
200 | } |
201 | |
201 | |
202 | static void cgit_parse_args(int argc, const char **argv) |
202 | static void cgit_parse_args(int argc, const char **argv) |
203 | { |
203 | { |
204 | int i; |
204 | int i; |
205 | |
205 | |
206 | for (i = 1; i < argc; i++) { |
206 | for (i = 1; i < argc; i++) { |
207 | if (!strncmp(argv[i], "--cache=", 8)) { |
207 | if (!strncmp(argv[i], "--cache=", 8)) { |
208 | cgit_cache_root = xstrdup(argv[i]+8); |
208 | cgit_cache_root = xstrdup(argv[i]+8); |
209 | } |
209 | } |
210 | if (!strcmp(argv[i], "--nocache")) { |
210 | if (!strcmp(argv[i], "--nocache")) { |
211 | cgit_nocache = 1; |
211 | cgit_nocache = 1; |
212 | } |
212 | } |
213 | if (!strncmp(argv[i], "--query=", 8)) { |
213 | if (!strncmp(argv[i], "--query=", 8)) { |
214 | cgit_querystring = xstrdup(argv[i]+8); |
214 | cgit_querystring = xstrdup(argv[i]+8); |
215 | } |
215 | } |
216 | if (!strncmp(argv[i], "--repo=", 7)) { |
216 | if (!strncmp(argv[i], "--repo=", 7)) { |
217 | cgit_query_repo = xstrdup(argv[i]+7); |
217 | cgit_query_repo = xstrdup(argv[i]+7); |
218 | } |
218 | } |
219 | if (!strncmp(argv[i], "--page=", 7)) { |
219 | if (!strncmp(argv[i], "--page=", 7)) { |
220 | cgit_query_page = xstrdup(argv[i]+7); |
220 | cgit_query_page = xstrdup(argv[i]+7); |
221 | } |
221 | } |
222 | if (!strncmp(argv[i], "--head=", 7)) { |
222 | if (!strncmp(argv[i], "--head=", 7)) { |
223 | cgit_query_head = xstrdup(argv[i]+7); |
223 | cgit_query_head = xstrdup(argv[i]+7); |
224 | cgit_query_has_symref = 1; |
224 | cgit_query_has_symref = 1; |
225 | } |
225 | } |
226 | if (!strncmp(argv[i], "--sha1=", 7)) { |
226 | if (!strncmp(argv[i], "--sha1=", 7)) { |
227 | cgit_query_sha1 = xstrdup(argv[i]+7); |
227 | cgit_query_sha1 = xstrdup(argv[i]+7); |
228 | cgit_query_has_sha1 = 1; |
228 | cgit_query_has_sha1 = 1; |
229 | } |
229 | } |
230 | if (!strncmp(argv[i], "--ofs=", 6)) { |
230 | if (!strncmp(argv[i], "--ofs=", 6)) { |
231 | cgit_query_ofs = atoi(argv[i]+6); |
231 | cgit_query_ofs = atoi(argv[i]+6); |
232 | } |
232 | } |
233 | } |
233 | } |
234 | } |
234 | } |
235 | |
235 | |
236 | int main(int argc, const char **argv) |
236 | int main(int argc, const char **argv) |
237 | { |
237 | { |
238 | struct cacheitem item; |
238 | struct cacheitem item; |
239 | |
239 | |
240 | htmlfd = STDOUT_FILENO; |
240 | htmlfd = STDOUT_FILENO; |
241 | item.st.st_mtime = time(NULL); |
241 | item.st.st_mtime = time(NULL); |
242 | cgit_repolist.length = 0; |
242 | cgit_repolist.length = 0; |
243 | cgit_repolist.count = 0; |
243 | cgit_repolist.count = 0; |
244 | cgit_repolist.repos = NULL; |
244 | cgit_repolist.repos = NULL; |
245 | |
245 | |
246 | cgit_read_config("/etc/cgitrc", cgit_global_config_cb); |
246 | cgit_read_config(CGIT_CONFIG, cgit_global_config_cb); |
247 | if (getenv("QUERY_STRING")) |
247 | if (getenv("QUERY_STRING")) |
248 | cgit_querystring = xstrdup(getenv("QUERY_STRING")); |
248 | cgit_querystring = xstrdup(getenv("QUERY_STRING")); |
249 | cgit_parse_args(argc, argv); |
249 | cgit_parse_args(argc, argv); |
250 | cgit_parse_query(cgit_querystring, cgit_querystring_cb); |
250 | cgit_parse_query(cgit_querystring, cgit_querystring_cb); |
251 | if (!cgit_prepare_cache(&item)) |
251 | if (!cgit_prepare_cache(&item)) |
252 | return 0; |
252 | return 0; |
253 | if (cgit_nocache) { |
253 | if (cgit_nocache) { |
254 | cgit_fill_cache(&item, 0); |
254 | cgit_fill_cache(&item, 0); |
255 | } else { |
255 | } else { |
256 | cgit_check_cache(&item); |
256 | cgit_check_cache(&item); |
257 | cgit_print_cache(&item); |
257 | cgit_print_cache(&item); |
258 | } |
258 | } |
259 | return 0; |
259 | return 0; |
260 | } |
260 | } |
|