summaryrefslogtreecommitdiffabout
path: root/cgit.h
authorJohan Herland <johan@herland.net>2010-09-30 18:15:14 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2010-11-09 15:37:39 (UTC)
commit1415f3f3e017d0123e850707c55cb7e5e5887406 (patch) (unidiff)
tree9036ea6ce534e40ff35394359332a9a628276c0f /cgit.h
parente0c6f23789e4893781bcd5af2281d468991ccf3a (diff)
downloadcgit-1415f3f3e017d0123e850707c55cb7e5e5887406.zip
cgit-1415f3f3e017d0123e850707c55cb7e5e5887406.tar.gz
cgit-1415f3f3e017d0123e850707c55cb7e5e5887406.tar.bz2
ui-log: Fix filecount/linecount when path limit is in effect
When using ui-log with path limits, the listing of commits enables parent rewriting in Git's internal log machinery. This did not work well together with cgit_diff_commit() which is used to generate the filecount and linecount numbers for each commit in the log view. cgit_diff_commit() would operate without any path limits, and would therefore process the full diff between the commits shown (which, because of parent rewriting, is not the same as processing the diff for the commit itself). Additionally, the bottom commit in the log view would (again, because of parent rewriting) have zero parents, causing us to process the entire diff between the empty tree and that commit. Since path limits were not in effect, this would (in large projects) reports thousands of files and millions of lines changed in that bottom commit. This patch fixes the issue by applying the same path limit to cgit_diff_commit() as is applied to the rest of the log view. The result is that the filecount/linecount now only reflects the diff as it pertains to the given path limit. Signed-off-by: Johan Herland <johan@herland.net> Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (limited to 'cgit.h') (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.h3
1 files changed, 2 insertions, 1 deletions
diff --git a/cgit.h b/cgit.h
index a9896cf..f5f68ac 100644
--- a/cgit.h
+++ b/cgit.h
@@ -41,277 +41,278 @@
41#define TM_MONTH (TM_YEAR / 12.0) 41#define TM_MONTH (TM_YEAR / 12.0)
42 42
43 43
44/* 44/*
45 * Default encoding 45 * Default encoding
46 */ 46 */
47#define PAGE_ENCODING "UTF-8" 47#define PAGE_ENCODING "UTF-8"
48 48
49typedef void (*configfn)(const char *name, const char *value); 49typedef void (*configfn)(const char *name, const char *value);
50typedef void (*filepair_fn)(struct diff_filepair *pair); 50typedef void (*filepair_fn)(struct diff_filepair *pair);
51typedef void (*linediff_fn)(char *line, int len); 51typedef void (*linediff_fn)(char *line, int len);
52 52
53struct cgit_filter { 53struct cgit_filter {
54 char *cmd; 54 char *cmd;
55 char **argv; 55 char **argv;
56 int old_stdout; 56 int old_stdout;
57 int pipe_fh[2]; 57 int pipe_fh[2];
58 int pid; 58 int pid;
59 int exitstatus; 59 int exitstatus;
60}; 60};
61 61
62struct cgit_repo { 62struct cgit_repo {
63 char *url; 63 char *url;
64 char *name; 64 char *name;
65 char *path; 65 char *path;
66 char *desc; 66 char *desc;
67 char *owner; 67 char *owner;
68 char *defbranch; 68 char *defbranch;
69 char *module_link; 69 char *module_link;
70 char *readme; 70 char *readme;
71 char *section; 71 char *section;
72 char *clone_url; 72 char *clone_url;
73 int snapshots; 73 int snapshots;
74 int enable_log_filecount; 74 int enable_log_filecount;
75 int enable_log_linecount; 75 int enable_log_linecount;
76 int enable_remote_branches; 76 int enable_remote_branches;
77 int enable_subject_links; 77 int enable_subject_links;
78 int max_stats; 78 int max_stats;
79 time_t mtime; 79 time_t mtime;
80 struct cgit_filter *about_filter; 80 struct cgit_filter *about_filter;
81 struct cgit_filter *commit_filter; 81 struct cgit_filter *commit_filter;
82 struct cgit_filter *source_filter; 82 struct cgit_filter *source_filter;
83}; 83};
84 84
85typedef void (*repo_config_fn)(struct cgit_repo *repo, const char *name, 85typedef void (*repo_config_fn)(struct cgit_repo *repo, const char *name,
86 const char *value); 86 const char *value);
87 87
88struct cgit_repolist { 88struct cgit_repolist {
89 int length; 89 int length;
90 int count; 90 int count;
91 struct cgit_repo *repos; 91 struct cgit_repo *repos;
92}; 92};
93 93
94struct commitinfo { 94struct commitinfo {
95 struct commit *commit; 95 struct commit *commit;
96 char *author; 96 char *author;
97 char *author_email; 97 char *author_email;
98 unsigned long author_date; 98 unsigned long author_date;
99 char *committer; 99 char *committer;
100 char *committer_email; 100 char *committer_email;
101 unsigned long committer_date; 101 unsigned long committer_date;
102 char *subject; 102 char *subject;
103 char *msg; 103 char *msg;
104 char *msg_encoding; 104 char *msg_encoding;
105}; 105};
106 106
107struct taginfo { 107struct taginfo {
108 char *tagger; 108 char *tagger;
109 char *tagger_email; 109 char *tagger_email;
110 unsigned long tagger_date; 110 unsigned long tagger_date;
111 char *msg; 111 char *msg;
112}; 112};
113 113
114struct refinfo { 114struct refinfo {
115 const char *refname; 115 const char *refname;
116 struct object *object; 116 struct object *object;
117 union { 117 union {
118 struct taginfo *tag; 118 struct taginfo *tag;
119 struct commitinfo *commit; 119 struct commitinfo *commit;
120 }; 120 };
121}; 121};
122 122
123struct reflist { 123struct reflist {
124 struct refinfo **refs; 124 struct refinfo **refs;
125 int alloc; 125 int alloc;
126 int count; 126 int count;
127}; 127};
128 128
129struct cgit_query { 129struct cgit_query {
130 int has_symref; 130 int has_symref;
131 int has_sha1; 131 int has_sha1;
132 char *raw; 132 char *raw;
133 char *repo; 133 char *repo;
134 char *page; 134 char *page;
135 char *search; 135 char *search;
136 char *grep; 136 char *grep;
137 char *head; 137 char *head;
138 char *sha1; 138 char *sha1;
139 char *sha2; 139 char *sha2;
140 char *path; 140 char *path;
141 char *name; 141 char *name;
142 char *mimetype; 142 char *mimetype;
143 char *url; 143 char *url;
144 char *period; 144 char *period;
145 int ofs; 145 int ofs;
146 int nohead; 146 int nohead;
147 char *sort; 147 char *sort;
148 int showmsg; 148 int showmsg;
149 int ssdiff; 149 int ssdiff;
150 int show_all; 150 int show_all;
151 int context; 151 int context;
152 int ignorews; 152 int ignorews;
153 char *vpath; 153 char *vpath;
154}; 154};
155 155
156struct cgit_config { 156struct cgit_config {
157 char *agefile; 157 char *agefile;
158 char *cache_root; 158 char *cache_root;
159 char *clone_prefix; 159 char *clone_prefix;
160 char *css; 160 char *css;
161 char *favicon; 161 char *favicon;
162 char *footer; 162 char *footer;
163 char *head_include; 163 char *head_include;
164 char *header; 164 char *header;
165 char *index_header; 165 char *index_header;
166 char *index_info; 166 char *index_info;
167 char *logo; 167 char *logo;
168 char *logo_link; 168 char *logo_link;
169 char *module_link; 169 char *module_link;
170 char *project_list; 170 char *project_list;
171 char *readme; 171 char *readme;
172 char *robots; 172 char *robots;
173 char *root_title; 173 char *root_title;
174 char *root_desc; 174 char *root_desc;
175 char *root_readme; 175 char *root_readme;
176 char *script_name; 176 char *script_name;
177 char *section; 177 char *section;
178 char *virtual_root; 178 char *virtual_root;
179 char *strict_export; 179 char *strict_export;
180 int cache_size; 180 int cache_size;
181 int cache_dynamic_ttl; 181 int cache_dynamic_ttl;
182 int cache_max_create_time; 182 int cache_max_create_time;
183 int cache_repo_ttl; 183 int cache_repo_ttl;
184 int cache_root_ttl; 184 int cache_root_ttl;
185 int cache_scanrc_ttl; 185 int cache_scanrc_ttl;
186 int cache_static_ttl; 186 int cache_static_ttl;
187 int embedded; 187 int embedded;
188 int enable_filter_overrides; 188 int enable_filter_overrides;
189 int enable_gitweb_owner; 189 int enable_gitweb_owner;
190 int enable_index_links; 190 int enable_index_links;
191 int enable_log_filecount; 191 int enable_log_filecount;
192 int enable_log_linecount; 192 int enable_log_linecount;
193 int enable_remote_branches; 193 int enable_remote_branches;
194 int enable_subject_links; 194 int enable_subject_links;
195 int enable_tree_linenumbers; 195 int enable_tree_linenumbers;
196 int local_time; 196 int local_time;
197 int max_atom_items; 197 int max_atom_items;
198 int max_repo_count; 198 int max_repo_count;
199 int max_commit_count; 199 int max_commit_count;
200 int max_lock_attempts; 200 int max_lock_attempts;
201 int max_msg_len; 201 int max_msg_len;
202 int max_repodesc_len; 202 int max_repodesc_len;
203 int max_blob_size; 203 int max_blob_size;
204 int max_stats; 204 int max_stats;
205 int nocache; 205 int nocache;
206 int noplainemail; 206 int noplainemail;
207 int noheader; 207 int noheader;
208 int renamelimit; 208 int renamelimit;
209 int remove_suffix; 209 int remove_suffix;
210 int section_from_path; 210 int section_from_path;
211 int snapshots; 211 int snapshots;
212 int summary_branches; 212 int summary_branches;
213 int summary_log; 213 int summary_log;
214 int summary_tags; 214 int summary_tags;
215 int ssdiff; 215 int ssdiff;
216 struct string_list mimetypes; 216 struct string_list mimetypes;
217 struct cgit_filter *about_filter; 217 struct cgit_filter *about_filter;
218 struct cgit_filter *commit_filter; 218 struct cgit_filter *commit_filter;
219 struct cgit_filter *source_filter; 219 struct cgit_filter *source_filter;
220}; 220};
221 221
222struct cgit_page { 222struct cgit_page {
223 time_t modified; 223 time_t modified;
224 time_t expires; 224 time_t expires;
225 size_t size; 225 size_t size;
226 char *mimetype; 226 char *mimetype;
227 char *charset; 227 char *charset;
228 char *filename; 228 char *filename;
229 char *etag; 229 char *etag;
230 char *title; 230 char *title;
231 int status; 231 int status;
232 char *statusmsg; 232 char *statusmsg;
233}; 233};
234 234
235struct cgit_environment { 235struct cgit_environment {
236 char *cgit_config; 236 char *cgit_config;
237 char *http_host; 237 char *http_host;
238 char *https; 238 char *https;
239 char *no_http; 239 char *no_http;
240 char *path_info; 240 char *path_info;
241 char *query_string; 241 char *query_string;
242 char *request_method; 242 char *request_method;
243 char *script_name; 243 char *script_name;
244 char *server_name; 244 char *server_name;
245 char *server_port; 245 char *server_port;
246}; 246};
247 247
248struct cgit_context { 248struct cgit_context {
249 struct cgit_environment env; 249 struct cgit_environment env;
250 struct cgit_query qry; 250 struct cgit_query qry;
251 struct cgit_config cfg; 251 struct cgit_config cfg;
252 struct cgit_repo *repo; 252 struct cgit_repo *repo;
253 struct cgit_page page; 253 struct cgit_page page;
254}; 254};
255 255
256struct cgit_snapshot_format { 256struct cgit_snapshot_format {
257 const char *suffix; 257 const char *suffix;
258 const char *mimetype; 258 const char *mimetype;
259 write_archive_fn_t write_func; 259 write_archive_fn_t write_func;
260 int bit; 260 int bit;
261}; 261};
262 262
263extern const char *cgit_version; 263extern const char *cgit_version;
264 264
265extern struct cgit_repolist cgit_repolist; 265extern struct cgit_repolist cgit_repolist;
266extern struct cgit_context ctx; 266extern struct cgit_context ctx;
267extern const struct cgit_snapshot_format cgit_snapshot_formats[]; 267extern const struct cgit_snapshot_format cgit_snapshot_formats[];
268 268
269extern struct cgit_repo *cgit_add_repo(const char *url); 269extern struct cgit_repo *cgit_add_repo(const char *url);
270extern struct cgit_repo *cgit_get_repoinfo(const char *url); 270extern struct cgit_repo *cgit_get_repoinfo(const char *url);
271extern void cgit_repo_config_cb(const char *name, const char *value); 271extern void cgit_repo_config_cb(const char *name, const char *value);
272 272
273extern int chk_zero(int result, char *msg); 273extern int chk_zero(int result, char *msg);
274extern int chk_positive(int result, char *msg); 274extern int chk_positive(int result, char *msg);
275extern int chk_non_negative(int result, char *msg); 275extern int chk_non_negative(int result, char *msg);
276 276
277extern char *trim_end(const char *str, char c); 277extern char *trim_end(const char *str, char c);
278extern char *strlpart(char *txt, int maxlen); 278extern char *strlpart(char *txt, int maxlen);
279extern char *strrpart(char *txt, int maxlen); 279extern char *strrpart(char *txt, int maxlen);
280 280
281extern void cgit_add_ref(struct reflist *list, struct refinfo *ref); 281extern void cgit_add_ref(struct reflist *list, struct refinfo *ref);
282extern int cgit_refs_cb(const char *refname, const unsigned char *sha1, 282extern int cgit_refs_cb(const char *refname, const unsigned char *sha1,
283 int flags, void *cb_data); 283 int flags, void *cb_data);
284 284
285extern void *cgit_free_commitinfo(struct commitinfo *info); 285extern void *cgit_free_commitinfo(struct commitinfo *info);
286 286
287extern int cgit_diff_files(const unsigned char *old_sha1, 287extern int cgit_diff_files(const unsigned char *old_sha1,
288 const unsigned char *new_sha1, 288 const unsigned char *new_sha1,
289 unsigned long *old_size, unsigned long *new_size, 289 unsigned long *old_size, unsigned long *new_size,
290 int *binary, int context, int ignorews, 290 int *binary, int context, int ignorews,
291 linediff_fn fn); 291 linediff_fn fn);
292 292
293extern void cgit_diff_tree(const unsigned char *old_sha1, 293extern void cgit_diff_tree(const unsigned char *old_sha1,
294 const unsigned char *new_sha1, 294 const unsigned char *new_sha1,
295 filepair_fn fn, const char *prefix, int ignorews); 295 filepair_fn fn, const char *prefix, int ignorews);
296 296
297extern void cgit_diff_commit(struct commit *commit, filepair_fn fn); 297extern void cgit_diff_commit(struct commit *commit, filepair_fn fn,
298 const char *prefix);
298 299
299__attribute__((format (printf,1,2))) 300__attribute__((format (printf,1,2)))
300extern char *fmt(const char *format,...); 301extern char *fmt(const char *format,...);
301 302
302extern struct commitinfo *cgit_parse_commit(struct commit *commit); 303extern struct commitinfo *cgit_parse_commit(struct commit *commit);
303extern struct taginfo *cgit_parse_tag(struct tag *tag); 304extern struct taginfo *cgit_parse_tag(struct tag *tag);
304extern void cgit_parse_url(const char *url); 305extern void cgit_parse_url(const char *url);
305 306
306extern const char *cgit_repobasename(const char *reponame); 307extern const char *cgit_repobasename(const char *reponame);
307 308
308extern int cgit_parse_snapshots_mask(const char *str); 309extern int cgit_parse_snapshots_mask(const char *str);
309 310
310extern int cgit_open_filter(struct cgit_filter *filter); 311extern int cgit_open_filter(struct cgit_filter *filter);
311extern int cgit_close_filter(struct cgit_filter *filter); 312extern int cgit_close_filter(struct cgit_filter *filter);
312 313
313extern int readfile(const char *path, char **buf, size_t *size); 314extern int readfile(const char *path, char **buf, size_t *size);
314 315
315extern char *expand_macros(const char *txt); 316extern char *expand_macros(const char *txt);
316 317
317#endif /* CGIT_H */ 318#endif /* CGIT_H */