Allow for creating patch series

This allows for specifying a revision range using the id2 parameter of
/patch/. The output that is produced is similar to

    $ git format-patch --stdout id2..id

Signed-off-by: Lukas Fleischer <cgit@cryptocrack.de>
This commit is contained in:
Lukas Fleischer 2013-08-20 18:56:14 +02:00 committed by Jason A. Donenfeld
parent 455b598778
commit 750f6462c9
3 changed files with 21 additions and 8 deletions

2
cmd.c
View File

@ -98,7 +98,7 @@ static void repolist_fn(struct cgit_context *ctx)
static void patch_fn(struct cgit_context *ctx) static void patch_fn(struct cgit_context *ctx)
{ {
cgit_print_patch(ctx->qry.sha1, ctx->qry.path); cgit_print_patch(ctx->qry.sha1, ctx->qry.sha2, ctx->qry.path);
} }
static void plain_fn(struct cgit_context *ctx) static void plain_fn(struct cgit_context *ctx)

View File

@ -11,7 +11,7 @@
#include "html.h" #include "html.h"
#include "ui-shared.h" #include "ui-shared.h"
void cgit_print_patch(char *hex, const char *prefix) void cgit_print_patch(char *hex, const char *old_rev, const char *prefix)
{ {
struct rev_info rev; struct rev_info rev;
struct commit *commit; struct commit *commit;
@ -33,16 +33,29 @@ void cgit_print_patch(char *hex, const char *prefix)
return; return;
} }
if (commit->parents && commit->parents->item) { if (old_rev) {
if (get_sha1(old_rev, old_sha1)) {
cgit_print_error("Bad object id: %s", old_rev);
return;
}
if (!lookup_commit_reference(old_sha1)) {
cgit_print_error("Bad commit reference: %s", old_rev);
return;
}
} else if (commit->parents && commit->parents->item) {
hashcpy(old_sha1, commit->parents->item->object.sha1); hashcpy(old_sha1, commit->parents->item->object.sha1);
sprintf(rev_range, "%s..%s", sha1_to_hex(old_sha1),
sha1_to_hex(sha1));
} else { } else {
hashclr(old_sha1); hashclr(old_sha1);
memcpy(rev_range, sha1_to_hex(sha1), 41);
} }
patchname = fmt("%s.patch", sha1_to_hex(sha1)); if (is_null_sha1(old_sha1)) {
memcpy(rev_range, sha1_to_hex(sha1), 41);
} else {
sprintf(rev_range, "%s..%s", sha1_to_hex(old_sha1),
sha1_to_hex(sha1));
}
patchname = fmt("%s.patch", rev_range);
ctx.page.mimetype = "text/plain"; ctx.page.mimetype = "text/plain";
ctx.page.filename = patchname; ctx.page.filename = patchname;
cgit_print_http_headers(&ctx); cgit_print_http_headers(&ctx);

View File

@ -1,6 +1,6 @@
#ifndef UI_PATCH_H #ifndef UI_PATCH_H
#define UI_PATCH_H #define UI_PATCH_H
extern void cgit_print_patch(char *hex, const char *prefix); extern void cgit_print_patch(char *hex, const char *old_rev, const char *prefix);
#endif /* UI_PATCH_H */ #endif /* UI_PATCH_H */