1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
#define USE_THE_REPOSITORY_VARIABLE
#include "cgit.h"
#include "html.h"
#include "ui-patch.h"
#include "ui-shared.h"
#define REV_RANGE_LEN (2 * GIT_MAX_HEXSZ + 3)
void cgit_print_patch(const char *new_rev, const char *old_rev, const char *prefix)
{
struct rev_info rev;
struct commit *commit;
struct object_id new_oid, old_oid;
struct strvec rev_argv = STRVEC_INIT;
char rev_range[REV_RANGE_LEN];
const char *version;
if (!new_rev)
new_rev = ctx.qry.head;
if (cgit_refuse_pathspec_magic(prefix))
return;
commit = cgit_get_commit(new_rev, &new_oid);
if (!commit || cgit_get_old_oid(old_rev, commit, &old_oid))
return;
if (is_null_oid(&old_oid)) {
oid_to_hex_r(rev_range, &new_oid);
} else {
xsnprintf(rev_range, sizeof(rev_range), "%s..%s", oid_to_hex(&old_oid), oid_to_hex(&new_oid));
}
strvec_pushl(&rev_argv, "patch", "--reverse", NULL);
if (ctx.cfg.enable_plain_email)
strvec_push(&rev_argv, "--format=email");
else
strvec_push(&rev_argv, "--format=format:From %H Mon Sep 17 00:00:00 2001%n"
"From: %an%nDate: %aD%n%w(78,0,1)Subject: %s%n%n%w(0)%b");
strvec_pushl(&rev_argv, rev_range, "--", NULL);
if (prefix)
strvec_push(&rev_argv, prefix);
if (ctx.cfg.max_blob_size)
repo_settings_set_big_file_threshold(the_repository, (unsigned long)ctx.cfg.max_blob_size * 1024);
repo_init_revisions(the_repository, &rev, NULL);
rev.verbose_header = 1;
rev.diff = 1;
rev.show_root_diff = 1;
rev.max_parents = 1;
rev.diffopt.output_format |= DIFF_FORMAT_DIFFSTAT | DIFF_FORMAT_PATCH | DIFF_FORMAT_SUMMARY;
if (prefix)
rev.diffopt.stat_sep = xstrfmt("(limited to '%s')\n\n", prefix);
setup_revisions_from_strvec(&rev_argv, &rev, NULL);
if (ctx.cfg.max_patch_count > 0)
rev.max_count = ctx.cfg.max_patch_count;
if (cgit_prepare_walk(&rev)) {
strvec_clear(&rev_argv);
return;
}
ctx.page.mimetype = "text/plain";
ctx.page.filename = cgit_fmt("%s.patch", rev_range);
cgit_print_http_headers();
if (!skip_prefix(cgit_version, "v", &version))
version = cgit_version;
while ((commit = get_revision(&rev))) {
log_tree_commit(&rev, commit);
if (ctx.cfg.enable_version_info)
printf("-- \ncgit %s\n\n", version);
else
printf("-- \ncgit\n\n");
}
release_revisions(&rev);
strvec_clear(&rev_argv);
}
|