summaryrefslogtreecommitdiffabout
path: root/cgit.h
authorLars Hjemli <hjemli@gmail.com>2008-11-29 15:46:37 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2008-11-29 15:46:37 (UTC)
commit8813170390f3c3a0f4743afbc92ede42953fa3b0 (patch) (unidiff)
tree39305350baee1eb564aae00294634bbe544983d3 /cgit.h
parent54272e60965ec6a98b49cbf67d72a4b1f5adc55b (diff)
downloadcgit-8813170390f3c3a0f4743afbc92ede42953fa3b0.zip
cgit-8813170390f3c3a0f4743afbc92ede42953fa3b0.tar.gz
cgit-8813170390f3c3a0f4743afbc92ede42953fa3b0.tar.bz2
ui-repolist: implement lazy caching of repo->mtime
When sorting the list of repositories by their last modification time, cgit would (in the worst case) invoke fstat(3) four times and open(3) twice for each callback from qsort(3). This obviously scales very badly. Now, the calculated modtime for each repo is saved in repo->mtime, thus keeping the number of stat/open invocations identical for sorted and unsorted repo-listings. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (limited to 'cgit.h') (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/cgit.h b/cgit.h
index ea90833..c99d337 100644
--- a/cgit.h
+++ b/cgit.h
@@ -1,244 +1,245 @@
1#ifndef CGIT_H 1#ifndef CGIT_H
2#define CGIT_H 2#define CGIT_H
3 3
4 4
5#include <git-compat-util.h> 5#include <git-compat-util.h>
6#include <cache.h> 6#include <cache.h>
7#include <grep.h> 7#include <grep.h>
8#include <object.h> 8#include <object.h>
9#include <tree.h> 9#include <tree.h>
10#include <commit.h> 10#include <commit.h>
11#include <tag.h> 11#include <tag.h>
12#include <diff.h> 12#include <diff.h>
13#include <diffcore.h> 13#include <diffcore.h>
14#include <refs.h> 14#include <refs.h>
15#include <revision.h> 15#include <revision.h>
16#include <log-tree.h> 16#include <log-tree.h>
17#include <archive.h> 17#include <archive.h>
18#include <xdiff/xdiff.h> 18#include <xdiff/xdiff.h>
19#include <utf8.h> 19#include <utf8.h>
20 20
21 21
22/* 22/*
23 * Dateformats used on misc. pages 23 * Dateformats used on misc. pages
24 */ 24 */
25#define FMT_LONGDATE "%Y-%m-%d %H:%M:%S (%Z)" 25#define FMT_LONGDATE "%Y-%m-%d %H:%M:%S (%Z)"
26#define FMT_SHORTDATE "%Y-%m-%d" 26#define FMT_SHORTDATE "%Y-%m-%d"
27#define FMT_ATOMDATE "%Y-%m-%dT%H:%M:%SZ" 27#define FMT_ATOMDATE "%Y-%m-%dT%H:%M:%SZ"
28 28
29 29
30/* 30/*
31 * Limits used for relative dates 31 * Limits used for relative dates
32 */ 32 */
33#define TM_MIN 60 33#define TM_MIN 60
34#define TM_HOUR (TM_MIN * 60) 34#define TM_HOUR (TM_MIN * 60)
35#define TM_DAY (TM_HOUR * 24) 35#define TM_DAY (TM_HOUR * 24)
36#define TM_WEEK (TM_DAY * 7) 36#define TM_WEEK (TM_DAY * 7)
37#define TM_YEAR (TM_DAY * 365) 37#define TM_YEAR (TM_DAY * 365)
38#define TM_MONTH (TM_YEAR / 12.0) 38#define TM_MONTH (TM_YEAR / 12.0)
39 39
40 40
41/* 41/*
42 * Default encoding 42 * Default encoding
43 */ 43 */
44#define PAGE_ENCODING "UTF-8" 44#define PAGE_ENCODING "UTF-8"
45 45
46typedef void (*configfn)(const char *name, const char *value); 46typedef void (*configfn)(const char *name, const char *value);
47typedef void (*filepair_fn)(struct diff_filepair *pair); 47typedef void (*filepair_fn)(struct diff_filepair *pair);
48typedef void (*linediff_fn)(char *line, int len); 48typedef void (*linediff_fn)(char *line, int len);
49 49
50struct cgit_repo { 50struct cgit_repo {
51 char *url; 51 char *url;
52 char *name; 52 char *name;
53 char *path; 53 char *path;
54 char *desc; 54 char *desc;
55 char *owner; 55 char *owner;
56 char *defbranch; 56 char *defbranch;
57 char *group; 57 char *group;
58 char *module_link; 58 char *module_link;
59 char *readme; 59 char *readme;
60 char *clone_url; 60 char *clone_url;
61 int snapshots; 61 int snapshots;
62 int enable_log_filecount; 62 int enable_log_filecount;
63 int enable_log_linecount; 63 int enable_log_linecount;
64 time_t mtime;
64}; 65};
65 66
66struct cgit_repolist { 67struct cgit_repolist {
67 int length; 68 int length;
68 int count; 69 int count;
69 struct cgit_repo *repos; 70 struct cgit_repo *repos;
70}; 71};
71 72
72struct commitinfo { 73struct commitinfo {
73 struct commit *commit; 74 struct commit *commit;
74 char *author; 75 char *author;
75 char *author_email; 76 char *author_email;
76 unsigned long author_date; 77 unsigned long author_date;
77 char *committer; 78 char *committer;
78 char *committer_email; 79 char *committer_email;
79 unsigned long committer_date; 80 unsigned long committer_date;
80 char *subject; 81 char *subject;
81 char *msg; 82 char *msg;
82 char *msg_encoding; 83 char *msg_encoding;
83}; 84};
84 85
85struct taginfo { 86struct taginfo {
86 char *tagger; 87 char *tagger;
87 char *tagger_email; 88 char *tagger_email;
88 unsigned long tagger_date; 89 unsigned long tagger_date;
89 char *msg; 90 char *msg;
90}; 91};
91 92
92struct refinfo { 93struct refinfo {
93 const char *refname; 94 const char *refname;
94 struct object *object; 95 struct object *object;
95 union { 96 union {
96 struct taginfo *tag; 97 struct taginfo *tag;
97 struct commitinfo *commit; 98 struct commitinfo *commit;
98 }; 99 };
99}; 100};
100 101
101struct reflist { 102struct reflist {
102 struct refinfo **refs; 103 struct refinfo **refs;
103 int alloc; 104 int alloc;
104 int count; 105 int count;
105}; 106};
106 107
107struct cgit_query { 108struct cgit_query {
108 int has_symref; 109 int has_symref;
109 int has_sha1; 110 int has_sha1;
110 char *raw; 111 char *raw;
111 char *repo; 112 char *repo;
112 char *page; 113 char *page;
113 char *search; 114 char *search;
114 char *grep; 115 char *grep;
115 char *head; 116 char *head;
116 char *sha1; 117 char *sha1;
117 char *sha2; 118 char *sha2;
118 char *path; 119 char *path;
119 char *name; 120 char *name;
120 char *mimetype; 121 char *mimetype;
121 char *url; 122 char *url;
122 int ofs; 123 int ofs;
123 int nohead; 124 int nohead;
124 char *sort; 125 char *sort;
125}; 126};
126 127
127struct cgit_config { 128struct cgit_config {
128 char *agefile; 129 char *agefile;
129 char *cache_root; 130 char *cache_root;
130 char *clone_prefix; 131 char *clone_prefix;
131 char *css; 132 char *css;
132 char *favicon; 133 char *favicon;
133 char *footer; 134 char *footer;
134 char *index_header; 135 char *index_header;
135 char *index_info; 136 char *index_info;
136 char *logo; 137 char *logo;
137 char *logo_link; 138 char *logo_link;
138 char *module_link; 139 char *module_link;
139 char *repo_group; 140 char *repo_group;
140 char *robots; 141 char *robots;
141 char *root_title; 142 char *root_title;
142 char *root_desc; 143 char *root_desc;
143 char *root_readme; 144 char *root_readme;
144 char *script_name; 145 char *script_name;
145 char *virtual_root; 146 char *virtual_root;
146 int cache_size; 147 int cache_size;
147 int cache_dynamic_ttl; 148 int cache_dynamic_ttl;
148 int cache_max_create_time; 149 int cache_max_create_time;
149 int cache_repo_ttl; 150 int cache_repo_ttl;
150 int cache_root_ttl; 151 int cache_root_ttl;
151 int cache_static_ttl; 152 int cache_static_ttl;
152 int enable_index_links; 153 int enable_index_links;
153 int enable_log_filecount; 154 int enable_log_filecount;
154 int enable_log_linecount; 155 int enable_log_linecount;
155 int local_time; 156 int local_time;
156 int max_repo_count; 157 int max_repo_count;
157 int max_commit_count; 158 int max_commit_count;
158 int max_lock_attempts; 159 int max_lock_attempts;
159 int max_msg_len; 160 int max_msg_len;
160 int max_repodesc_len; 161 int max_repodesc_len;
161 int nocache; 162 int nocache;
162 int renamelimit; 163 int renamelimit;
163 int snapshots; 164 int snapshots;
164 int summary_branches; 165 int summary_branches;
165 int summary_log; 166 int summary_log;
166 int summary_tags; 167 int summary_tags;
167}; 168};
168 169
169struct cgit_page { 170struct cgit_page {
170 time_t modified; 171 time_t modified;
171 time_t expires; 172 time_t expires;
172 size_t size; 173 size_t size;
173 char *mimetype; 174 char *mimetype;
174 char *charset; 175 char *charset;
175 char *filename; 176 char *filename;
176 char *title; 177 char *title;
177}; 178};
178 179
179struct cgit_context { 180struct cgit_context {
180 struct cgit_query qry; 181 struct cgit_query qry;
181 struct cgit_config cfg; 182 struct cgit_config cfg;
182 struct cgit_repo *repo; 183 struct cgit_repo *repo;
183 struct cgit_page page; 184 struct cgit_page page;
184}; 185};
185 186
186struct cgit_snapshot_format { 187struct cgit_snapshot_format {
187 const char *suffix; 188 const char *suffix;
188 const char *mimetype; 189 const char *mimetype;
189 write_archive_fn_t write_func; 190 write_archive_fn_t write_func;
190 int bit; 191 int bit;
191}; 192};
192 193
193extern const char *cgit_version; 194extern const char *cgit_version;
194 195
195extern struct cgit_repolist cgit_repolist; 196extern struct cgit_repolist cgit_repolist;
196extern struct cgit_context ctx; 197extern struct cgit_context ctx;
197extern const struct cgit_snapshot_format cgit_snapshot_formats[]; 198extern const struct cgit_snapshot_format cgit_snapshot_formats[];
198 199
199extern struct cgit_repo *cgit_add_repo(const char *url); 200extern struct cgit_repo *cgit_add_repo(const char *url);
200extern struct cgit_repo *cgit_get_repoinfo(const char *url); 201extern struct cgit_repo *cgit_get_repoinfo(const char *url);
201extern void cgit_repo_config_cb(const char *name, const char *value); 202extern void cgit_repo_config_cb(const char *name, const char *value);
202 203
203extern int chk_zero(int result, char *msg); 204extern int chk_zero(int result, char *msg);
204extern int chk_positive(int result, char *msg); 205extern int chk_positive(int result, char *msg);
205extern int chk_non_negative(int result, char *msg); 206extern int chk_non_negative(int result, char *msg);
206 207
207extern char *trim_end(const char *str, char c); 208extern char *trim_end(const char *str, char c);
208extern char *strlpart(char *txt, int maxlen); 209extern char *strlpart(char *txt, int maxlen);
209extern char *strrpart(char *txt, int maxlen); 210extern char *strrpart(char *txt, int maxlen);
210 211
211extern void cgit_add_ref(struct reflist *list, struct refinfo *ref); 212extern void cgit_add_ref(struct reflist *list, struct refinfo *ref);
212extern int cgit_refs_cb(const char *refname, const unsigned char *sha1, 213extern int cgit_refs_cb(const char *refname, const unsigned char *sha1,
213 int flags, void *cb_data); 214 int flags, void *cb_data);
214 215
215extern void *cgit_free_commitinfo(struct commitinfo *info); 216extern void *cgit_free_commitinfo(struct commitinfo *info);
216 217
217extern int cgit_diff_files(const unsigned char *old_sha1, 218extern int cgit_diff_files(const unsigned char *old_sha1,
218 const unsigned char *new_sha1, 219 const unsigned char *new_sha1,
219 linediff_fn fn); 220 linediff_fn fn);
220 221
221extern void cgit_diff_tree(const unsigned char *old_sha1, 222extern void cgit_diff_tree(const unsigned char *old_sha1,
222 const unsigned char *new_sha1, 223 const unsigned char *new_sha1,
223 filepair_fn fn, const char *prefix); 224 filepair_fn fn, const char *prefix);
224 225
225extern void cgit_diff_commit(struct commit *commit, filepair_fn fn); 226extern void cgit_diff_commit(struct commit *commit, filepair_fn fn);
226 227
227extern char *fmt(const char *format,...); 228extern char *fmt(const char *format,...);
228 229
229extern struct commitinfo *cgit_parse_commit(struct commit *commit); 230extern struct commitinfo *cgit_parse_commit(struct commit *commit);
230extern struct taginfo *cgit_parse_tag(struct tag *tag); 231extern struct taginfo *cgit_parse_tag(struct tag *tag);
231extern void cgit_parse_url(const char *url); 232extern void cgit_parse_url(const char *url);
232 233
233extern const char *cgit_repobasename(const char *reponame); 234extern const char *cgit_repobasename(const char *reponame);
234 235
235extern int cgit_parse_snapshots_mask(const char *str); 236extern int cgit_parse_snapshots_mask(const char *str);
236 237
237/* libgit.a either links against or compiles its own implementation of 238/* libgit.a either links against or compiles its own implementation of
238 * strcasestr(), and we'd like to reuse it. Simply re-declaring it 239 * strcasestr(), and we'd like to reuse it. Simply re-declaring it
239 * seems to do the trick. 240 * seems to do the trick.
240 */ 241 */
241extern char *strcasestr(const char *haystack, const char *needle); 242extern char *strcasestr(const char *haystack, const char *needle);
242 243
243 244
244#endif /* CGIT_H */ 245#endif /* CGIT_H */