*/
#include "cgit.h"
+#include "html.h"
+#include "ui-shared.h"
static void print_line(char *line, int len)
{
static void filepair_cb(struct diff_filepair *pair)
{
+ unsigned long old_size = 0;
+ unsigned long new_size = 0;
+ int binary = 0;
+
header(pair->one->sha1, pair->one->path, pair->one->mode,
pair->two->sha1, pair->two->path, pair->two->mode);
if (S_ISGITLINK(pair->one->mode) || S_ISGITLINK(pair->two->mode)) {
print_line(fmt("+Subproject %s", sha1_to_hex(pair->two->sha1)), 52);
return;
}
- if (cgit_diff_files(pair->one->sha1, pair->two->sha1, print_line))
+ if (cgit_diff_files(pair->one->sha1, pair->two->sha1, &old_size,
+ &new_size, &binary, 0, 0, print_line))
html("Error running diff");
+ if (binary)
+ html("Binary files differ\n");
}
-void cgit_print_patch(char *hex, struct cacheitem *item)
+void cgit_print_patch(char *hex, const char *prefix)
{
struct commit *commit;
struct commitinfo *info;
char *patchname;
if (!hex)
- hex = cgit_query_head;
+ hex = ctx.qry.head;
if (get_sha1(hex, sha1)) {
cgit_print_error(fmt("Bad object id: %s", hex));
return;
}
info = cgit_parse_commit(commit);
- hashcpy(old_sha1, commit->parents->item->object.sha1);
+
+ if (commit->parents && commit->parents->item)
+ hashcpy(old_sha1, commit->parents->item->object.sha1);
+ else
+ hashclr(old_sha1);
patchname = fmt("%s.patch", sha1_to_hex(sha1));
- cgit_print_snapshot_start("text/plain", patchname, item);
+ ctx.page.mimetype = "text/plain";
+ ctx.page.filename = patchname;
+ cgit_print_http_headers(&ctx);
htmlf("From %s Mon Sep 17 00:00:00 2001\n", sha1_to_hex(sha1));
- htmlf("From: %s%s\n", info->author, info->author_email);
+ htmlf("From: %s", info->author);
+ if (!ctx.cfg.noplainemail) {
+ htmlf(" %s", info->author_email);
+ }
+ html("\n");
html("Date: ");
- cgit_print_date(info->author_date, "%a, %d %b %Y %H:%M:%S %z%n");
+ cgit_print_date(info->author_date, "%a, %d %b %Y %H:%M:%S %z%n", ctx.cfg.local_time);
htmlf("Subject: %s\n\n", info->subject);
if (info->msg && *info->msg) {
htmlf("%s", info->msg);
html("\n");
}
html("---\n");
- cgit_diff_tree(old_sha1, sha1, filepair_cb, NULL);
+ if (prefix)
+ htmlf("(limited to '%s')\n\n", prefix);
+ cgit_diff_tree(old_sha1, sha1, filepair_cb, prefix, 0);
html("--\n");
htmlf("cgit %s\n", CGIT_VERSION);
cgit_free_commitinfo(info);