Blame


1 40fa9110 2020-10-20 neels --- test019.left.txt
2 40fa9110 2020-10-20 neels +++ test019.right.txt
3 40fa9110 2020-10-20 neels @@ -40,8 +40,23 @@
4 40fa9110 2020-10-20 neels #include "got_lib_object.h"
5 40fa9110 2020-10-20 neels
6 40fa9110 2020-10-20 neels static const struct got_error *
7 40fa9110 2020-10-20 neels -diff_blobs(struct got_diffreg_result **resultp,
8 40fa9110 2020-10-20 neels -struct got_blob_object *blob1, struct got_blob_object *blob2,
9 40fa9110 2020-10-20 neels +add_line_offset(off_t **line_offsets, size_t *nlines, off_t off)
10 40fa9110 2020-10-20 neels +{
11 40fa9110 2020-10-20 neels + off_t *p;
12 40fa9110 2020-10-20 neels +
13 40fa9110 2020-10-20 neels + p = reallocarray(*line_offsets, *nlines + 1, sizeof(off_t));
14 40fa9110 2020-10-20 neels + if (p == NULL)
15 40fa9110 2020-10-20 neels + return got_error_from_errno("reallocarray");
16 40fa9110 2020-10-20 neels + *line_offsets = p;
17 40fa9110 2020-10-20 neels + (*line_offsets)[*nlines] = off;
18 40fa9110 2020-10-20 neels + (*nlines)++;
19 40fa9110 2020-10-20 neels + return NULL;
20 40fa9110 2020-10-20 neels +}
21 40fa9110 2020-10-20 neels +
22 40fa9110 2020-10-20 neels +static const struct got_error *
23 40fa9110 2020-10-20 neels +diff_blobs(off_t **line_offsets, size_t *nlines,
24 40fa9110 2020-10-20 neels + struct got_diffreg_result **resultp, struct got_blob_object *blob1,
25 40fa9110 2020-10-20 neels + struct got_blob_object *blob2,
26 40fa9110 2020-10-20 neels const char *label1, const char *label2, mode_t mode1, mode_t mode2,
27 40fa9110 2020-10-20 neels int diff_context, int ignore_whitespace, FILE *outfile)
28 40fa9110 2020-10-20 neels {
29 40fa9110 2020-10-20 neels @@ -52,7 +67,12 @@
30 40fa9110 2020-10-20 neels char *idstr1 = NULL, *idstr2 = NULL;
31 40fa9110 2020-10-20 neels size_t size1, size2;
32 40fa9110 2020-10-20 neels struct got_diffreg_result *result;
33 40fa9110 2020-10-20 neels + off_t outoff = 0;
34 40fa9110 2020-10-20 neels + int n;
35 40fa9110 2020-10-20 neels
36 40fa9110 2020-10-20 neels + if (line_offsets && *line_offsets && *nlines > 0)
37 40fa9110 2020-10-20 neels + outoff = (*line_offsets)[*nlines - 1];
38 40fa9110 2020-10-20 neels +
39 40fa9110 2020-10-20 neels if (resultp)
40 40fa9110 2020-10-20 neels *resultp = NULL;
41 40fa9110 2020-10-20 neels
42 40fa9110 2020-10-20 neels @@ -116,10 +136,32 @@
43 40fa9110 2020-10-20 neels goto done;
44 40fa9110 2020-10-20 neels }
45 40fa9110 2020-10-20 neels }
46 40fa9110 2020-10-20 neels - fprintf(outfile, "blob - %s%s\n", idstr1,
47 40fa9110 2020-10-20 neels + n = fprintf(outfile, "blob - %s%s\n", idstr1,
48 40fa9110 2020-10-20 neels modestr1 ? modestr1 : "");
49 40fa9110 2020-10-20 neels - fprintf(outfile, "blob + %s%s\n", idstr2,
50 40fa9110 2020-10-20 neels + if (n < 0) {
51 40fa9110 2020-10-20 neels + err = got_error_from_errno("fprintf");
52 40fa9110 2020-10-20 neels + goto done;
53 40fa9110 2020-10-20 neels + }
54 40fa9110 2020-10-20 neels + outoff += n;
55 40fa9110 2020-10-20 neels + if (line_offsets) {
56 40fa9110 2020-10-20 neels + err = add_line_offset(line_offsets, nlines, outoff);
57 40fa9110 2020-10-20 neels + if (err)
58 40fa9110 2020-10-20 neels + goto done;
59 40fa9110 2020-10-20 neels + }
60 40fa9110 2020-10-20 neels +
61 40fa9110 2020-10-20 neels + n = fprintf(outfile, "blob + %s%s\n", idstr2,
62 40fa9110 2020-10-20 neels modestr2 ? modestr2 : "");
63 40fa9110 2020-10-20 neels + if (n < 0) {
64 40fa9110 2020-10-20 neels + err = got_error_from_errno("fprintf");
65 40fa9110 2020-10-20 neels + goto done;
66 40fa9110 2020-10-20 neels + }
67 40fa9110 2020-10-20 neels + outoff += n;
68 40fa9110 2020-10-20 neels + if (line_offsets) {
69 40fa9110 2020-10-20 neels + err = add_line_offset(line_offsets, nlines, outoff);
70 40fa9110 2020-10-20 neels + if (err)
71 40fa9110 2020-10-20 neels + goto done;
72 40fa9110 2020-10-20 neels + }
73 40fa9110 2020-10-20 neels +
74 40fa9110 2020-10-20 neels free(modestr1);
75 40fa9110 2020-10-20 neels free(modestr2);
76 40fa9110 2020-10-20 neels }
77 40fa9110 2020-10-20 neels @@ -129,7 +171,7 @@
78 40fa9110 2020-10-20 neels goto done;
79 40fa9110 2020-10-20 neels
80 40fa9110 2020-10-20 neels if (outfile) {
81 40fa9110 2020-10-20 neels - err = got_diffreg_output(NULL, NULL, result, f1, f2,
82 40fa9110 2020-10-20 neels + err = got_diffreg_output(line_offsets, nlines, result, f1, f2,
83 40fa9110 2020-10-20 neels label1 ? label1 : idstr1,
84 40fa9110 2020-10-20 neels label2 ? label2 : idstr2,
85 40fa9110 2020-10-20 neels GOT_DIFF_OUTPUT_UNIDIFF, diff_context, outfile);
86 40fa9110 2020-10-20 neels @@ -158,21 +200,21 @@
87 40fa9110 2020-10-20 neels struct got_object_id *id2, const char *label1, const char *label2,
88 40fa9110 2020-10-20 neels mode_t mode1, mode_t mode2, struct got_repository *repo)
89 40fa9110 2020-10-20 neels {
90 40fa9110 2020-10-20 neels - const struct got_error *err;
91 40fa9110 2020-10-20 neels struct got_diff_blob_output_unidiff_arg *a = arg;
92 40fa9110 2020-10-20 neels
93 40fa9110 2020-10-20 neels - err = diff_blobs(NULL, blob1, blob2, label1, label2, mode1, mode2,
94 40fa9110 2020-10-20 neels - a->diff_context, a->ignore_whitespace, a->outfile);
95 40fa9110 2020-10-20 neels - return err;
96 40fa9110 2020-10-20 neels + return diff_blobs(&a->line_offsets, &a->nlines, NULL,
97 40fa9110 2020-10-20 neels + blob1, blob2, label1, label2, mode1, mode2, a->diff_context,
98 40fa9110 2020-10-20 neels + a->ignore_whitespace, a->outfile);
99 40fa9110 2020-10-20 neels }
100 40fa9110 2020-10-20 neels
101 40fa9110 2020-10-20 neels const struct got_error *
102 40fa9110 2020-10-20 neels -got_diff_blob(struct got_blob_object *blob1, struct got_blob_object *blob2,
103 40fa9110 2020-10-20 neels +got_diff_blob(off_t **line_offsets, size_t *nlines,
104 40fa9110 2020-10-20 neels + struct got_blob_object *blob1, struct got_blob_object *blob2,
105 40fa9110 2020-10-20 neels const char *label1, const char *label2, int diff_context,
106 40fa9110 2020-10-20 neels int ignore_whitespace, FILE *outfile)
107 40fa9110 2020-10-20 neels {
108 40fa9110 2020-10-20 neels - return diff_blobs(NULL, blob1, blob2, label1, label2, 0, 0, diff_context,
109 40fa9110 2020-10-20 neels - ignore_whitespace, outfile);
110 40fa9110 2020-10-20 neels + return diff_blobs(line_offsets, nlines, NULL, blob1, blob2,
111 40fa9110 2020-10-20 neels + label1, label2, 0, 0, diff_context, ignore_whitespace, outfile);
112 40fa9110 2020-10-20 neels }
113 40fa9110 2020-10-20 neels
114 40fa9110 2020-10-20 neels static const struct got_error *
115 40fa9110 2020-10-20 neels @@ -259,7 +301,8 @@
116 40fa9110 2020-10-20 neels {
117 40fa9110 2020-10-20 neels const struct got_error *err = NULL;
118 40fa9110 2020-10-20 neels
119 40fa9110 2020-10-20 neels - err = diff_blobs(result, blob1, blob2, NULL, NULL, 0, 0, 3, 0, NULL);
120 40fa9110 2020-10-20 neels + err = diff_blobs(NULL, NULL, result, blob1, blob2,
121 40fa9110 2020-10-20 neels + NULL, NULL, 0, 0, 3, 0, NULL);
122 40fa9110 2020-10-20 neels if (err) {
123 40fa9110 2020-10-20 neels got_diffreg_result_free(*result);
124 40fa9110 2020-10-20 neels *result = NULL;
125 40fa9110 2020-10-20 neels @@ -702,7 +745,8 @@
126 40fa9110 2020-10-20 neels }
127 40fa9110 2020-10-20 neels
128 40fa9110 2020-10-20 neels const struct got_error *
129 40fa9110 2020-10-20 neels -got_diff_objects_as_blobs(struct got_object_id *id1, struct got_object_id *id2,
130 40fa9110 2020-10-20 neels +got_diff_objects_as_blobs(off_t **line_offsets, size_t *nlines,
131 40fa9110 2020-10-20 neels + struct got_object_id *id1, struct got_object_id *id2,
132 40fa9110 2020-10-20 neels const char *label1, const char *label2, int diff_context,
133 40fa9110 2020-10-20 neels int ignore_whitespace, struct got_repository *repo, FILE *outfile)
134 40fa9110 2020-10-20 neels {
135 40fa9110 2020-10-20 neels @@ -722,8 +766,8 @@
136 40fa9110 2020-10-20 neels if (err)
137 40fa9110 2020-10-20 neels goto done;
138 40fa9110 2020-10-20 neels }
139 40fa9110 2020-10-20 neels - err = got_diff_blob(blob1, blob2, label1, label2, diff_context,
140 40fa9110 2020-10-20 neels - ignore_whitespace, outfile);
141 40fa9110 2020-10-20 neels + err = got_diff_blob(line_offsets, nlines, blob1, blob2,
142 40fa9110 2020-10-20 neels + label1, label2, diff_context, ignore_whitespace, outfile);
143 40fa9110 2020-10-20 neels done:
144 40fa9110 2020-10-20 neels if (blob1)
145 40fa9110 2020-10-20 neels got_object_blob_close(blob1);
146 40fa9110 2020-10-20 neels @@ -733,13 +777,15 @@
147 40fa9110 2020-10-20 neels }
148 40fa9110 2020-10-20 neels
149 40fa9110 2020-10-20 neels const struct got_error *
150 40fa9110 2020-10-20 neels -got_diff_objects_as_trees(struct got_object_id *id1, struct got_object_id *id2,
151 40fa9110 2020-10-20 neels +got_diff_objects_as_trees(off_t **line_offsets, size_t *nlines,
152 40fa9110 2020-10-20 neels + struct got_object_id *id1, struct got_object_id *id2,
153 40fa9110 2020-10-20 neels char *label1, char *label2, int diff_context, int ignore_whitespace,
154 40fa9110 2020-10-20 neels struct got_repository *repo, FILE *outfile)
155 40fa9110 2020-10-20 neels {
156 40fa9110 2020-10-20 neels const struct got_error *err;
157 40fa9110 2020-10-20 neels struct got_tree_object *tree1 = NULL, *tree2 = NULL;
158 40fa9110 2020-10-20 neels struct got_diff_blob_output_unidiff_arg arg;
159 40fa9110 2020-10-20 neels + int want_lineoffsets = (line_offsets != NULL && *line_offsets != NULL);
160 40fa9110 2020-10-20 neels
161 40fa9110 2020-10-20 neels if (id1 == NULL && id2 == NULL)
162 40fa9110 2020-10-20 neels return got_error(GOT_ERR_NO_OBJ);
163 40fa9110 2020-10-20 neels @@ -757,8 +803,20 @@
164 40fa9110 2020-10-20 neels arg.diff_context = diff_context;
165 40fa9110 2020-10-20 neels arg.ignore_whitespace = ignore_whitespace;
166 40fa9110 2020-10-20 neels arg.outfile = outfile;
167 40fa9110 2020-10-20 neels + if (want_lineoffsets) {
168 40fa9110 2020-10-20 neels + arg.line_offsets = *line_offsets;
169 40fa9110 2020-10-20 neels + arg.nlines = *nlines;
170 40fa9110 2020-10-20 neels + } else {
171 40fa9110 2020-10-20 neels + arg.line_offsets = NULL;
172 40fa9110 2020-10-20 neels + arg.nlines = 0;
173 40fa9110 2020-10-20 neels + }
174 40fa9110 2020-10-20 neels err = got_diff_tree(tree1, tree2, label1, label2, repo,
175 40fa9110 2020-10-20 neels got_diff_blob_output_unidiff, &arg, 1);
176 40fa9110 2020-10-20 neels +
177 40fa9110 2020-10-20 neels + if (want_lineoffsets) {
178 40fa9110 2020-10-20 neels + *line_offsets = arg.line_offsets; /* was likely re-allocated */
179 40fa9110 2020-10-20 neels + *nlines = arg.nlines;
180 40fa9110 2020-10-20 neels + }
181 40fa9110 2020-10-20 neels done:
182 40fa9110 2020-10-20 neels if (tree1)
183 40fa9110 2020-10-20 neels got_object_tree_close(tree1);
184 40fa9110 2020-10-20 neels @@ -768,8 +826,9 @@
185 40fa9110 2020-10-20 neels }
186 40fa9110 2020-10-20 neels
187 40fa9110 2020-10-20 neels const struct got_error *
188 40fa9110 2020-10-20 neels -got_diff_objects_as_commits(struct got_object_id *id1,
189 40fa9110 2020-10-20 neels - struct got_object_id *id2, int diff_context, int ignore_whitespace,
190 40fa9110 2020-10-20 neels +got_diff_objects_as_commits(off_t **line_offsets, size_t *nlines,
191 40fa9110 2020-10-20 neels + struct got_object_id *id1, struct got_object_id *id2,
192 40fa9110 2020-10-20 neels + int diff_context, int ignore_whitespace,
193 40fa9110 2020-10-20 neels struct got_repository *repo, FILE *outfile)
194 40fa9110 2020-10-20 neels {
195 40fa9110 2020-10-20 neels const struct got_error *err;
196 40fa9110 2020-10-20 neels @@ -788,7 +847,7 @@
197 40fa9110 2020-10-20 neels if (err)
198 40fa9110 2020-10-20 neels goto done;
199 40fa9110 2020-10-20 neels
200 40fa9110 2020-10-20 neels - err = got_diff_objects_as_trees(
201 40fa9110 2020-10-20 neels + err = got_diff_objects_as_trees(line_offsets, nlines,
202 40fa9110 2020-10-20 neels commit1 ? got_object_commit_get_tree_id(commit1) : NULL,
203 40fa9110 2020-10-20 neels got_object_commit_get_tree_id(commit2), "", "", diff_context,
204 40fa9110 2020-10-20 neels ignore_whitespace, repo, outfile);