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_generate_h__
8 #define INCLUDE_patch_generate_h__
9 
10 #include "common.h"
11 
12 #include "diff.h"
13 #include "diff_file.h"
14 #include "patch.h"
15 
16 enum {
17 	GIT_PATCH_GENERATED_ALLOCATED = (1 << 0),
18 	GIT_PATCH_GENERATED_INITIALIZED = (1 << 1),
19 	GIT_PATCH_GENERATED_LOADED = (1 << 2),
20 	/* the two sides are different */
21 	GIT_PATCH_GENERATED_DIFFABLE = (1 << 3),
22 	/* the difference between the two sides has been computed */
23 	GIT_PATCH_GENERATED_DIFFED = (1 << 4),
24 	GIT_PATCH_GENERATED_FLATTENED = (1 << 5),
25 };
26 
27 struct git_patch_generated {
28 	struct git_patch base;
29 
30 	git_diff *diff; /* for refcount purposes, maybe NULL for blob diffs */
31 	size_t delta_index;
32 	git_diff_file_content ofile;
33 	git_diff_file_content nfile;
34 	uint32_t flags;
35 	git_pool flattened;
36 };
37 
38 typedef struct git_patch_generated git_patch_generated;
39 
40 extern git_diff_driver *git_patch_generated_driver(git_patch_generated *);
41 
42 extern void git_patch_generated_old_data(
43 	char **, size_t *, git_patch_generated *);
44 extern void git_patch_generated_new_data(
45 	char **, size_t *, git_patch_generated *);
46 extern int git_patch_generated_from_diff(
47 	git_patch **, git_diff *, size_t);
48 
49 typedef struct git_patch_generated_output git_patch_generated_output;
50 
51 struct git_patch_generated_output {
52 	/* these callbacks are issued with the diff data */
53 	git_diff_file_cb file_cb;
54 	git_diff_binary_cb binary_cb;
55 	git_diff_hunk_cb hunk_cb;
56 	git_diff_line_cb data_cb;
57 	void *payload;
58 
59 	/* this records the actual error in cases where it may be obscured */
60 	int error;
61 
62 	/* this callback is used to do the diff and drive the other callbacks.
63 	 * see diff_xdiff.h for how to use this in practice for now.
64 	 */
65 	int (*diff_cb)(git_patch_generated_output *output,
66 		git_patch_generated *patch);
67 };
68 
69 #endif
70