author | Jonathan Bastien-Filiatrault <joe@x2a.org> | 2007-10-26 22:13:41 (UTC) |
---|---|---|
committer | Jonathan Bastien-Filiatrault <joe@x2a.org> | 2007-11-05 23:13:31 (UTC) |
commit | 7858a309d7671109950ec940f893c2d112d36b99 (patch) (unidiff) | |
tree | 676723bafc103e232341aa05be4d57ed773b9feb | |
parent | af0819830445e39584a0137034562086a55deaf2 (diff) | |
download | cgit-7858a309d7671109950ec940f893c2d112d36b99.zip cgit-7858a309d7671109950ec940f893c2d112d36b99.tar.gz cgit-7858a309d7671109950ec940f893c2d112d36b99.tar.bz2 |
Convert subject and message with iconv_msg.
-rw-r--r-- | parsing.c | 14 |
1 files changed, 14 insertions, 0 deletions
@@ -259,116 +259,130 @@ struct commitinfo *cgit_parse_commit(struct commit *commit) | |||
259 | ret->msg = NULL; | 259 | ret->msg = NULL; |
260 | ret->msg_encoding = NULL; | 260 | ret->msg_encoding = NULL; |
261 | 261 | ||
262 | if (p == NULL) | 262 | if (p == NULL) |
263 | return ret; | 263 | return ret; |
264 | 264 | ||
265 | if (strncmp(p, "tree ", 5)) | 265 | if (strncmp(p, "tree ", 5)) |
266 | die("Bad commit: %s", sha1_to_hex(commit->object.sha1)); | 266 | die("Bad commit: %s", sha1_to_hex(commit->object.sha1)); |
267 | else | 267 | else |
268 | p += 46; // "tree " + hex[40] + "\n" | 268 | p += 46; // "tree " + hex[40] + "\n" |
269 | 269 | ||
270 | while (!strncmp(p, "parent ", 7)) | 270 | while (!strncmp(p, "parent ", 7)) |
271 | p += 48; // "parent " + hex[40] + "\n" | 271 | p += 48; // "parent " + hex[40] + "\n" |
272 | 272 | ||
273 | if (!strncmp(p, "author ", 7)) { | 273 | if (!strncmp(p, "author ", 7)) { |
274 | p += 7; | 274 | p += 7; |
275 | t = strchr(p, '<') - 1; | 275 | t = strchr(p, '<') - 1; |
276 | ret->author = substr(p, t); | 276 | ret->author = substr(p, t); |
277 | p = t; | 277 | p = t; |
278 | t = strchr(t, '>') + 1; | 278 | t = strchr(t, '>') + 1; |
279 | ret->author_email = substr(p, t); | 279 | ret->author_email = substr(p, t); |
280 | ret->author_date = atol(++t); | 280 | ret->author_date = atol(++t); |
281 | p = strchr(t, '\n') + 1; | 281 | p = strchr(t, '\n') + 1; |
282 | } | 282 | } |
283 | 283 | ||
284 | if (!strncmp(p, "committer ", 9)) { | 284 | if (!strncmp(p, "committer ", 9)) { |
285 | p += 9; | 285 | p += 9; |
286 | t = strchr(p, '<') - 1; | 286 | t = strchr(p, '<') - 1; |
287 | ret->committer = substr(p, t); | 287 | ret->committer = substr(p, t); |
288 | p = t; | 288 | p = t; |
289 | t = strchr(t, '>') + 1; | 289 | t = strchr(t, '>') + 1; |
290 | ret->committer_email = substr(p, t); | 290 | ret->committer_email = substr(p, t); |
291 | ret->committer_date = atol(++t); | 291 | ret->committer_date = atol(++t); |
292 | p = strchr(t, '\n') + 1; | 292 | p = strchr(t, '\n') + 1; |
293 | } | 293 | } |
294 | 294 | ||
295 | if (!strncmp(p, "encoding ", 9)) { | 295 | if (!strncmp(p, "encoding ", 9)) { |
296 | p += 9; | 296 | p += 9; |
297 | t = strchr(p, '\n') + 1; | 297 | t = strchr(p, '\n') + 1; |
298 | ret->msg_encoding = substr(p, t); | 298 | ret->msg_encoding = substr(p, t); |
299 | p = t; | 299 | p = t; |
300 | } else | 300 | } else |
301 | ret->msg_encoding = xstrdup(PAGE_ENCODING); | 301 | ret->msg_encoding = xstrdup(PAGE_ENCODING); |
302 | 302 | ||
303 | while (*p && (*p != '\n')) | 303 | while (*p && (*p != '\n')) |
304 | p = strchr(p, '\n') + 1; // skip unknown header fields | 304 | p = strchr(p, '\n') + 1; // skip unknown header fields |
305 | 305 | ||
306 | while (*p == '\n') | 306 | while (*p == '\n') |
307 | p = strchr(p, '\n') + 1; | 307 | p = strchr(p, '\n') + 1; |
308 | 308 | ||
309 | t = strchr(p, '\n'); | 309 | t = strchr(p, '\n'); |
310 | if (t) { | 310 | if (t) { |
311 | if (*t == '\0') | 311 | if (*t == '\0') |
312 | ret->subject = "** empty **"; | 312 | ret->subject = "** empty **"; |
313 | else | 313 | else |
314 | ret->subject = substr(p, t); | 314 | ret->subject = substr(p, t); |
315 | p = t + 1; | 315 | p = t + 1; |
316 | 316 | ||
317 | while (*p == '\n') | 317 | while (*p == '\n') |
318 | p = strchr(p, '\n') + 1; | 318 | p = strchr(p, '\n') + 1; |
319 | ret->msg = xstrdup(p); | 319 | ret->msg = xstrdup(p); |
320 | } else | 320 | } else |
321 | ret->subject = substr(p, p+strlen(p)); | 321 | ret->subject = substr(p, p+strlen(p)); |
322 | 322 | ||
323 | if(strcmp(ret->msg_encoding, PAGE_ENCODING)) { | ||
324 | t = iconv_msg(ret->subject, ret->msg_encoding); | ||
325 | if(t) { | ||
326 | free(ret->subject); | ||
327 | ret->subject = t; | ||
328 | } | ||
329 | |||
330 | t = iconv_msg(ret->msg, ret->msg_encoding); | ||
331 | if(t) { | ||
332 | free(ret->msg); | ||
333 | ret->msg = t; | ||
334 | } | ||
335 | } | ||
336 | |||
323 | return ret; | 337 | return ret; |
324 | } | 338 | } |
325 | 339 | ||
326 | 340 | ||
327 | struct taginfo *cgit_parse_tag(struct tag *tag) | 341 | struct taginfo *cgit_parse_tag(struct tag *tag) |
328 | { | 342 | { |
329 | void *data; | 343 | void *data; |
330 | enum object_type type; | 344 | enum object_type type; |
331 | unsigned long size; | 345 | unsigned long size; |
332 | char *p, *t; | 346 | char *p, *t; |
333 | struct taginfo *ret; | 347 | struct taginfo *ret; |
334 | 348 | ||
335 | data = read_sha1_file(tag->object.sha1, &type, &size); | 349 | data = read_sha1_file(tag->object.sha1, &type, &size); |
336 | if (!data || type != OBJ_TAG) { | 350 | if (!data || type != OBJ_TAG) { |
337 | free(data); | 351 | free(data); |
338 | return 0; | 352 | return 0; |
339 | } | 353 | } |
340 | 354 | ||
341 | ret = xmalloc(sizeof(*ret)); | 355 | ret = xmalloc(sizeof(*ret)); |
342 | ret->tagger = NULL; | 356 | ret->tagger = NULL; |
343 | ret->tagger_email = NULL; | 357 | ret->tagger_email = NULL; |
344 | ret->tagger_date = 0; | 358 | ret->tagger_date = 0; |
345 | ret->msg = NULL; | 359 | ret->msg = NULL; |
346 | 360 | ||
347 | p = data; | 361 | p = data; |
348 | 362 | ||
349 | while (p && *p) { | 363 | while (p && *p) { |
350 | if (*p == '\n') | 364 | if (*p == '\n') |
351 | break; | 365 | break; |
352 | 366 | ||
353 | if (!strncmp(p, "tagger ", 7)) { | 367 | if (!strncmp(p, "tagger ", 7)) { |
354 | p += 7; | 368 | p += 7; |
355 | t = strchr(p, '<') - 1; | 369 | t = strchr(p, '<') - 1; |
356 | ret->tagger = substr(p, t); | 370 | ret->tagger = substr(p, t); |
357 | p = t; | 371 | p = t; |
358 | t = strchr(t, '>') + 1; | 372 | t = strchr(t, '>') + 1; |
359 | ret->tagger_email = substr(p, t); | 373 | ret->tagger_email = substr(p, t); |
360 | ret->tagger_date = atol(++t); | 374 | ret->tagger_date = atol(++t); |
361 | } | 375 | } |
362 | p = strchr(p, '\n') + 1; | 376 | p = strchr(p, '\n') + 1; |
363 | } | 377 | } |
364 | 378 | ||
365 | while (p && *p && (*p != '\n')) | 379 | while (p && *p && (*p != '\n')) |
366 | p = strchr(p, '\n') + 1; // skip unknown tag fields | 380 | p = strchr(p, '\n') + 1; // skip unknown tag fields |
367 | 381 | ||
368 | while (p && (*p == '\n')) | 382 | while (p && (*p == '\n')) |
369 | p = strchr(p, '\n') + 1; | 383 | p = strchr(p, '\n') + 1; |
370 | if (p && *p) | 384 | if (p && *p) |
371 | ret->msg = xstrdup(p); | 385 | ret->msg = xstrdup(p); |
372 | free(data); | 386 | free(data); |
373 | return ret; | 387 | return ret; |
374 | } | 388 | } |