the repository which powers this website
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/* ui-patch.c: generate patch view
 *
 * Copyright (C) 2007 Lars Hjemli
 *
 * Licensed under GNU General Public License v2
 *   (see COPYING for full license text)
 */

#include "cgit.h"
#include "html.h"
#include "ui-shared.h"

static void print_line(char *line, int len)
{
	char c = line[len-1];

	line[len-1] = '\0';
	htmlf("%s\n", line);
	line[len-1] = c;
}

static void header(unsigned char *sha1, char *path1, int mode1,
		   unsigned char *sha2, char *path2, int mode2)
{
	char *abbrev1, *abbrev2;
	int subproject;

	subproject = (S_ISGITLINK(mode1) || S_ISGITLINK(mode2));
	htmlf("diff --git a/%s b/%s\n", path1, path2);

	if (is_null_sha1(sha1))
		path1 = "dev/null";
	if (is_null_sha1(sha2))
		path2 = "dev/null";

	if (mode1 == 0)
		htmlf("new file mode %.6o\n", mode2);

	if (mode2 == 0)
		htmlf("deleted file mode %.6o\n", mode1);

	if (!subproject) {
		abbrev1 = xstrdup(find_unique_abbrev(sha1, DEFAULT_ABBREV));
		abbrev2 = xstrdup(find_unique_abbrev(sha2, DEFAULT_ABBREV));
		htmlf("index %s..%s", abbrev1, abbrev2);
		free(abbrev1);
		free(abbrev2);
		if (mode1 != 0 && mode2 != 0) {
			htmlf(" %.6o", mode1);
			if (mode2 != mode1)
				htmlf("..%.6o", mode2);
		}
		htmlf("\n--- a/%s\n", path1);
		htmlf("+++ b/%s\n", path2);
	}
}

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)) {
		if (S_ISGITLINK(pair->one->mode))
			print_line(fmt("-Subproject %s", sha1_to_hex(pair->one->sha1)), 52);
		if (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, &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, const char *prefix)
{
	struct commit *commit;
	struct commitinfo *info;
	unsigned char sha1[20], old_sha1[20];
	char *patchname;

	if (!hex)
		hex = ctx.qry.head;

	if (get_sha1(hex, sha1)) {
		cgit_print_error(fmt("Bad object id: %s", hex));
		return;
	}
	commit = lookup_commit_reference(sha1);
	if (!commit) {
		cgit_print_error(fmt("Bad commit reference: %s", hex));
		return;
	}
	info = cgit_parse_commit(commit);

	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));
	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", 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", ctx.cfg.local_time);
	htmlf("Subject: %s\n\n", info->subject);
	if (info->msg && *info->msg) {
		htmlf("%s", info->msg);
		if (info->msg[strlen(info->msg) - 1] != '\n')
			html("\n");
	}
	html("---\n");
	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);
}
5a9660dc0" class="hover:text-[#73D0FF] hover:underline"> .gitmodules
-rw-r--r--
78
.mailmap
-rw-r--r--
579
AUTHORS
-rw-r--r--
340
COPYING
-rw-r--r--
18009
Makefile
-rw-r--r--
4439
README
-rw-r--r--
3004
cache.c
-rw-r--r--
10813
cache.h
-rw-r--r--
981
cgit-doc.css
-rw-r--r--
42
cgit.c
-rw-r--r--
34749
cgit.css
-rw-r--r--
13082
cgit.h
-rw-r--r--
9116
cgit.mk
-rw-r--r--
4401
cgit.png
-rw-r--r--
1366
cgitrc.5.txt
-rw-r--r--
33100
cmd.c
-rw-r--r--
4060
cmd.h
-rw-r--r--
244
configfile.c
-rw-r--r--
1612
configfile.h
-rw-r--r--
239
contrib
d---------
favicon.ico
-rw-r--r--
1078
filter.c
-rw-r--r--
11333
filters
d---------
gen-version.sh
-rwxr-xr-x
434
git @ 6ebdac1
m---------
html.c
-rw-r--r--
7579
html.h
-rw-r--r--
1321
parsing.c
-rw-r--r--
4749
robots.txt
-rw-r--r--
47
scan-tree.c
-rw-r--r--
6441
scan-tree.h
-rw-r--r--
150
shared.c
-rw-r--r--
13643
tests
d---------
ui-atom.c
-rw-r--r--
3431
ui-atom.h
-rw-r--r--
112
ui-blob.c
-rw-r--r--
4176
ui-blob.h
-rw-r--r--
308
ui-clone.c
-rw-r--r--
2430
ui-clone.h
-rw-r--r--
151
ui-commit.c
-rw-r--r--
4377
ui-commit.h
-rw-r--r--
129
ui-diff.c
-rw-r--r--
13133
ui-diff.h
-rw-r--r--
432
ui-log.c
-rw-r--r--
14544
ui-log.h
-rw-r--r--
278
ui-patch.c
-rw-r--r--
2411
ui-patch.h
-rw-r--r--
164
ui-plain.c
-rw-r--r--
5122
ui-plain.h
-rw-r--r--
100
ui-refs.c
-rw-r--r--
6183
ui-refs.h
-rw-r--r--
186
ui-repolist.c
-rw-r--r--
8678
ui-repolist.h
-rw-r--r--
154
ui-shared.c
-rw-r--r--
28139
ui-shared.h
-rw-r--r--
3681
ui-snapshot.c
-rw-r--r--
6146
ui-snapshot.h
-rw-r--r--
177
ui-ssdiff.c
-rw-r--r--
9342
ui-ssdiff.h
-rw-r--r--
495
ui-stats.c
-rw-r--r--
9915
ui-stats.h
-rw-r--r--
624
ui-summary.c
-rw-r--r--
3654
ui-summary.h
-rw-r--r--
156
ui-tag.c
-rw-r--r--
2970
ui-tag.h
-rw-r--r--
101
ui-tree.c
-rw-r--r--
9785
ui-tree.h
-rw-r--r--
119
README.md