1 /*
2 * Copyright (C) the libgit2 contributors. All rights reserved.
3 *
4 * This file is part of libgit2, distributed under the GNU GPL v2 with
5 * a Linking Exception. For full terms see the included COPYING file.
6 */
7 #ifndef INCLUDE_patch_h__
8 #define INCLUDE_patch_h__
9 
10 #include "common.h"
11 
12 #include "git2/patch.h"
13 #include "array.h"
14 
15 /* cached information about a hunk in a patch */
16 typedef struct git_patch_hunk {
17 	git_diff_hunk hunk;
18 	size_t line_start;
19 	size_t line_count;
20 } git_patch_hunk;
21 
22 struct git_patch {
23 	git_refcount rc;
24 
25 	git_repository *repo; /* may be null */
26 
27 	git_diff_options diff_opts;
28 
29 	git_diff_delta *delta;
30 	git_diff_binary binary;
31 	git_array_t(git_patch_hunk) hunks;
32 	git_array_t(git_diff_line) lines;
33 
34 	size_t header_size;
35 	size_t content_size;
36 	size_t context_size;
37 
38 	void (*free_fn)(git_patch *patch);
39 };
40 
41 extern int git_patch__invoke_callbacks(
42 	git_patch *patch,
43 	git_diff_file_cb file_cb,
44 	git_diff_binary_cb binary_cb,
45 	git_diff_hunk_cb hunk_cb,
46 	git_diff_line_cb line_cb,
47 	void *payload);
48 
49 extern int git_patch_line_stats(
50 	size_t *total_ctxt,
51 	size_t *total_adds,
52 	size_t *total_dels,
53 	const git_patch *patch);
54 
55 /** Options for parsing patch files. */
56 typedef struct {
57 	/**
58 	 * The length of the prefix (in path segments) for the filenames.
59 	 * This prefix will be removed when looking for files.  The default is 1.
60 	 */
61 	uint32_t prefix_len;
62 } git_patch_options;
63 
64 #define GIT_PATCH_OPTIONS_INIT { 1 }
65 
66 extern void git_patch_free(git_patch *patch);
67 
68 #endif
69