1 module git2.diff;
2 
3 import git2.common;
4 import git2.oid;
5 import git2.refs;
6 import git2.strarray;
7 import git2.util;
8 import git2.tree;
9 import git2.types;
10 
11 extern (C):
12 
13 enum git_diff_option_t {
14 	GIT_DIFF_NORMAL = 0,
15 	GIT_DIFF_REVERSE = (1 << 0),
16 	GIT_DIFF_FORCE_TEXT = (1 << 1),
17 	GIT_DIFF_IGNORE_WHITESPACE = (1 << 2),
18 	GIT_DIFF_IGNORE_WHITESPACE_CHANGE = (1 << 3),
19 	GIT_DIFF_IGNORE_WHITESPACE_EOL = (1 << 4),
20 	GIT_DIFF_IGNORE_SUBMODULES = (1 << 5),
21 	GIT_DIFF_PATIENCE = (1 << 6),
22 	GIT_DIFF_INCLUDE_IGNORED = (1 << 7),
23 	GIT_DIFF_INCLUDE_UNTRACKED = (1 << 8),
24 	GIT_DIFF_INCLUDE_UNMODIFIED = (1 << 9),
25 	GIT_DIFF_RECURSE_UNTRACKED_DIRS = (1 << 10),
26 	GIT_DIFF_DISABLE_PATHSPEC_MATCH = (1 << 11),
27 	GIT_DIFF_DELTAS_ARE_ICASE = (1 << 12),
28 	GIT_DIFF_INCLUDE_UNTRACKED_CONTENT = (1 << 13),
29 	GIT_DIFF_SKIP_BINARY_CHECK = (1 << 14),
30 	GIT_DIFF_INCLUDE_TYPECHANGE = (1 << 15),
31 	GIT_DIFF_INCLUDE_TYPECHANGE_TREES  = (1 << 16),
32 	GIT_DIFF_IGNORE_FILEMODE = (1 << 17),
33 	GIT_DIFF_RECURSE_IGNORED_DIRS = (1 << 18),
34 	GIT_DIFF_FAST_UNTRACKED_DIRS = (1 << 19),
35 	GIT_DIFF_FORCE_BINARY = (1 << 20),
36 }
37 mixin _ExportEnumMembers!git_diff_option_t;
38 
39 struct git_diff_list
40 {
41     @disable this();
42     @disable this(this);
43 }
44 
45 enum git_diff_flag_t {
46 	GIT_DIFF_FLAG_BINARY     = (1 << 0),
47 	GIT_DIFF_FLAG_NOT_BINARY = (1 << 1),
48 	GIT_DIFF_FLAG_VALID_OID  = (1 << 2),
49 }
50 mixin _ExportEnumMembers!git_diff_flag_t;
51 
52 enum git_delta_t {
53 	GIT_DELTA_UNMODIFIED = 0,
54 	GIT_DELTA_ADDED = 1,
55 	GIT_DELTA_DELETED = 2,
56 	GIT_DELTA_MODIFIED = 3,
57 	GIT_DELTA_RENAMED = 4,
58 	GIT_DELTA_COPIED = 5,
59 	GIT_DELTA_IGNORED = 6,
60 	GIT_DELTA_UNTRACKED = 7,
61 	GIT_DELTA_TYPECHANGE = 8,
62 }
63 mixin _ExportEnumMembers!git_delta_t;
64 
65 struct git_diff_file {
66 	git_oid     oid;
67 	const(char)* path;
68 	git_off_t   size;
69 	uint32_t    flags;
70 	uint16_t    mode;
71 }
72 
73 struct git_diff_delta {
74 	git_diff_file old_file;
75 	git_diff_file new_file;
76 	git_delta_t   status;
77 	uint32_t      similarity;
78 	uint32_t      flags;
79 }
80 
81 alias git_diff_notify_cb = int function(
82 	const(git_diff_list)* diff_so_far,
83 	const(git_diff_delta)* delta_to_add,
84 	const(char)* matched_pathspec,
85 	void *payload);
86 
87 struct git_diff_options {
88 	uint version_ = GIT_DIFF_OPTIONS_VERSION;
89 	uint32_t flags;
90 	uint16_t context_lines;
91 	uint16_t interhunk_lines;
92 	const(char)* old_prefix;
93 	const(char)* new_prefix;
94 	git_strarray pathspec;
95 	git_off_t max_size;
96 	git_diff_notify_cb notify_cb;
97 	void *notify_payload;
98 } ;
99 
100 enum GIT_DIFF_OPTIONS_VERSION = 1;
101 enum git_diff_options GIT_DIFF_OPTIONS_INIT = { GIT_DIFF_OPTIONS_VERSION, GIT_DIFF_NORMAL, 3 };
102 
103 alias git_diff_file_cb = int function(
104 	const(git_diff_delta)* delta,
105 	float progress,
106 	void *payload);
107 
108 struct git_diff_range {
109 	int old_start;
110 	int old_lines;
111 	int new_start;
112 	int new_lines;
113 }
114 
115 alias git_diff_hunk_cb = int function(
116 	const(git_diff_delta)* delta,
117 	const(git_diff_range)* range,
118 	const(char)* header,
119 	size_t header_len,
120 	void *payload);
121 
122 enum git_diff_line_t {
123 	GIT_DIFF_LINE_CONTEXT   = ' ',
124 	GIT_DIFF_LINE_ADDITION  = '+',
125 	GIT_DIFF_LINE_DELETION  = '-',
126 	GIT_DIFF_LINE_CONTEXT_EOFNL = '=',
127 	GIT_DIFF_LINE_ADD_EOFNL = '>',
128 	GIT_DIFF_LINE_DEL_EOFNL = '<',
129 	GIT_DIFF_LINE_FILE_HDR  = 'F',
130 	GIT_DIFF_LINE_HUNK_HDR  = 'H',
131 	GIT_DIFF_LINE_BINARY    = 'B'
132 }
133 mixin _ExportEnumMembers!git_diff_line_t;
134 
135 alias git_diff_data_cb = int function(
136 	const(git_diff_delta)* delta,
137 	const(git_diff_range)* range,
138 	char line_origin,
139 	const(char)* content,
140 	size_t content_len,
141 	void *payload);
142 
143 struct git_diff_patch
144 {
145     @disable this();
146     @disable this(this);
147 }
148 
149 enum git_diff_find_t {
150 	GIT_DIFF_FIND_RENAMES = (1 << 0),
151 	GIT_DIFF_FIND_RENAMES_FROM_REWRITES = (1 << 1),
152 	GIT_DIFF_FIND_COPIES = (1 << 2),
153 	GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED = (1 << 3),
154 	GIT_DIFF_FIND_REWRITES = (1 << 4),
155 	GIT_DIFF_BREAK_REWRITES = (1 << 5),
156 	GIT_DIFF_FIND_AND_BREAK_REWRITES =
157 		(GIT_DIFF_FIND_REWRITES | GIT_DIFF_BREAK_REWRITES),
158 	GIT_DIFF_FIND_FOR_UNTRACKED = (1 << 6),
159 	GIT_DIFF_FIND_ALL = (0x0ff),
160 	GIT_DIFF_FIND_IGNORE_LEADING_WHITESPACE = 0,
161 	GIT_DIFF_FIND_IGNORE_WHITESPACE = (1 << 12),
162 	GIT_DIFF_FIND_DONT_IGNORE_WHITESPACE = (1 << 13),
163 	GIT_DIFF_FIND_EXACT_MATCH_ONLY = (1 << 14),
164 }
165 mixin _ExportEnumMembers!git_diff_find_t;
166 
167 struct git_diff_similarity_metric {
168 	int function(
169 		void **out_, const(git_diff_file)* file,
170 		const(char)* fullpath, void *payload) file_signature;
171 	int function(
172 		void **out_, const(git_diff_file)* file,
173 		const(char)* buf, size_t buflen, void *payload) buffer_signature;
174 	void function(void *sig, void *payload) free_signature;
175 	int function(int *score, void *siga, void *sigb, void *payload) similarity;
176 	void *payload;
177 }
178 
179 struct git_diff_find_options {
180 	uint version_ = GIT_DIFF_FIND_OPTIONS_VERSION;
181 	uint32_t flags;
182 	uint16_t rename_threshold;
183 	uint16_t rename_from_rewrite_threshold;
184 	uint16_t copy_threshold;
185 	uint16_t break_rewrite_threshold;
186 	size_t rename_limit;
187 	git_diff_similarity_metric *metric;
188 }
189 
190 enum GIT_DIFF_FIND_OPTIONS_VERSION = 1;
191 enum git_diff_find_options GIT_DIFF_FIND_OPTIONS_INIT = { GIT_DIFF_FIND_OPTIONS_VERSION };
192 
193 void git_diff_list_free(git_diff_list *diff);
194 int git_diff_tree_to_tree(
195 	git_diff_list **diff,
196 	git_repository *repo,
197 	git_tree *old_tree,
198 	git_tree *new_tree,
199 	const(git_diff_options)* opts);
200 int git_diff_tree_to_index(
201 	git_diff_list **diff,
202 	git_repository *repo,
203 	git_tree *old_tree,
204 	git_index *index,
205 	const(git_diff_options)* opts);
206 int git_diff_index_to_workdir(
207 	git_diff_list **diff,
208 	git_repository *repo,
209 	git_index *index,
210 	const(git_diff_options)* opts);
211 int git_diff_tree_to_workdir(
212 	git_diff_list **diff,
213 	git_repository *repo,
214 	git_tree *old_tree,
215 	const(git_diff_options)* opts);
216 int git_diff_merge(
217 	git_diff_list *onto,
218 	const(git_diff_list)* from);
219 int git_diff_find_similar(
220 	git_diff_list *diff,
221 	git_diff_find_options *options);
222 int git_diff_foreach(
223 	git_diff_list *diff,
224 	git_diff_file_cb file_cb,
225 	git_diff_hunk_cb hunk_cb,
226 	git_diff_data_cb line_cb,
227 	void *payload);
228 int git_diff_print_compact(
229 	git_diff_list *diff,
230 	git_diff_data_cb print_cb,
231 	void *payload);
232 int git_diff_print_raw(
233 	git_diff_list *diff,
234 	git_diff_data_cb print_cb,
235 	void *payload);
236 char git_diff_status_char(git_delta_t status);
237 int git_diff_print_patch(
238 	git_diff_list *diff,
239 	git_diff_data_cb print_cb,
240 	void *payload);
241 size_t git_diff_num_deltas(git_diff_list *diff);
242 size_t git_diff_num_deltas_of_type(
243 	git_diff_list *diff,
244 	git_delta_t type);
245 int git_diff_get_patch(
246 	git_diff_patch **patch_out,
247 	const(git_diff_delta)** delta_out,
248 	git_diff_list *diff,
249 	size_t idx);
250 void git_diff_patch_free(
251 	git_diff_patch *patch);
252 const(git_diff_delta)*  git_diff_patch_delta(
253 	git_diff_patch *patch);
254 size_t git_diff_patch_num_hunks(
255 	git_diff_patch *patch);
256 int git_diff_patch_line_stats(
257 	size_t *total_context,
258 	size_t *total_additions,
259 	size_t *total_deletions,
260 	const(git_diff_patch)* patch);
261 int git_diff_patch_get_hunk(
262 	const(git_diff_range)** range,
263 	const(char)** header,
264 	size_t *header_len,
265 	size_t *lines_in_hunk,
266 	git_diff_patch *patch,
267 	size_t hunk_idx);
268 int git_diff_patch_num_lines_in_hunk(
269 	git_diff_patch *patch,
270 	size_t hunk_idx);
271 int git_diff_patch_get_line_in_hunk(
272 	char *line_origin,
273 	const(char)** content,
274 	size_t *content_len,
275 	int *old_lineno,
276 	int *new_lineno,
277 	git_diff_patch *patch,
278 	size_t hunk_idx,
279 	size_t line_of_hunk);
280 int git_diff_patch_print(
281 	git_diff_patch *patch,
282 	git_diff_data_cb print_cb,
283 	void *payload);
284 int git_diff_patch_to_str(
285 	char **string,
286 	git_diff_patch *patch);
287 int git_diff_blobs(
288 	const(git_blob)* old_blob,
289 	const(char)* old_as_path,
290 	const(git_blob)* new_blob,
291 	const(char)* new_as_path,
292 	const(git_diff_options)* options,
293 	git_diff_file_cb file_cb,
294 	git_diff_hunk_cb hunk_cb,
295 	git_diff_data_cb line_cb,
296 	void *payload);
297 int git_diff_patch_from_blobs(
298 	git_diff_patch **out_,
299 	const(git_blob)* old_blob,
300 	const(char)* old_as_path,
301 	const(git_blob)* new_blob,
302 	const(char)* new_as_path,
303 	const(git_diff_options)* opts);
304 int git_diff_blob_to_buffer(
305 	const(git_blob)* old_blob,
306 	const(char)* old_as_path,
307 	const(char)* buffer,
308 	size_t buffer_len,
309 	const(char)* buffer_as_path,
310 	const(git_diff_options)* options,
311 	git_diff_file_cb file_cb,
312 	git_diff_hunk_cb hunk_cb,
313 	git_diff_data_cb data_cb,
314 	void *payload);
315 int git_diff_patch_from_blob_and_buffer(
316 	git_diff_patch **out_,
317 	const(git_blob)* old_blob,
318 	const(char)* old_as_path,
319 	const(char)* buffer,
320 	size_t buffer_len,
321 	const(char)* buffer_as_path,
322 	const(git_diff_options)* opts);