]> git.proxmox.com Git - libgit2.git/blob - include/git2/apply.h
b248eaafea3decb3d8cd2ed3bba057d34fcea36f
[libgit2.git] / include / git2 / apply.h
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_git_apply_h__
8 #define INCLUDE_git_apply_h__
9
10 #include "common.h"
11 #include "types.h"
12 #include "oid.h"
13 #include "diff.h"
14
15 /**
16 * @file git2/apply.h
17 * @brief Git patch application routines
18 * @defgroup git_apply Git patch application routines
19 * @ingroup Git
20 * @{
21 */
22 GIT_BEGIN_DECL
23
24 /**
25 * When applying a patch, callback that will be made per delta (file).
26 *
27 * When the callback:
28 * - returns < 0, the apply process will be aborted.
29 * - returns > 0, the delta will not be applied, but the apply process
30 * continues
31 * - returns 0, the delta is applied, and the apply process continues.
32 *
33 * @param delta The delta to be applied
34 * @param payload User-specified payload
35 */
36 typedef int GIT_CALLBACK(git_apply_delta_cb)(
37 const git_diff_delta *delta,
38 void *payload);
39
40 /**
41 * When applying a patch, callback that will be made per hunk.
42 *
43 * When the callback:
44 * - returns < 0, the apply process will be aborted.
45 * - returns > 0, the hunk will not be applied, but the apply process
46 * continues
47 * - returns 0, the hunk is applied, and the apply process continues.
48 *
49 * @param hunk The hunk to be applied
50 * @param payload User-specified payload
51 */
52 typedef int GIT_CALLBACK(git_apply_hunk_cb)(
53 const git_diff_hunk *hunk,
54 void *payload);
55
56 /** Flags controlling the behavior of git_apply */
57 typedef enum {
58 /**
59 * Don't actually make changes, just test that the patch applies.
60 * This is the equivalent of `git apply --check`.
61 */
62 GIT_APPLY_CHECK = (1 << 0),
63 } git_apply_flags_t;
64
65 /**
66 * Apply options structure
67 *
68 * Initialize with `GIT_APPLY_OPTIONS_INIT`. Alternatively, you can
69 * use `git_apply_options_init`.
70 *
71 * @see git_apply_to_tree, git_apply
72 */
73 typedef struct {
74 unsigned int version; /**< The version */
75
76 /** When applying a patch, callback that will be made per delta (file). */
77 git_apply_delta_cb delta_cb;
78
79 /** When applying a patch, callback that will be made per hunk. */
80 git_apply_hunk_cb hunk_cb;
81
82 /** Payload passed to both delta_cb & hunk_cb. */
83 void *payload;
84
85 /** Bitmask of git_apply_flags_t */
86 unsigned int flags;
87 } git_apply_options;
88
89 #define GIT_APPLY_OPTIONS_VERSION 1
90 #define GIT_APPLY_OPTIONS_INIT {GIT_APPLY_OPTIONS_VERSION}
91
92 GIT_EXTERN(int) git_apply_options_init(git_apply_options *opts, unsigned int version);
93
94 /**
95 * Apply a `git_diff` to a `git_tree`, and return the resulting image
96 * as an index.
97 *
98 * @param out the postimage of the application
99 * @param repo the repository to apply
100 * @param preimage the tree to apply the diff to
101 * @param diff the diff to apply
102 * @param options the options for the apply (or null for defaults)
103 */
104 GIT_EXTERN(int) git_apply_to_tree(
105 git_index **out,
106 git_repository *repo,
107 git_tree *preimage,
108 git_diff *diff,
109 const git_apply_options *options);
110
111 /** Possible application locations for git_apply */
112 typedef enum {
113 /**
114 * Apply the patch to the workdir, leaving the index untouched.
115 * This is the equivalent of `git apply` with no location argument.
116 */
117 GIT_APPLY_LOCATION_WORKDIR = 0,
118
119 /**
120 * Apply the patch to the index, leaving the working directory
121 * untouched. This is the equivalent of `git apply --cached`.
122 */
123 GIT_APPLY_LOCATION_INDEX = 1,
124
125 /**
126 * Apply the patch to both the working directory and the index.
127 * This is the equivalent of `git apply --index`.
128 */
129 GIT_APPLY_LOCATION_BOTH = 2,
130 } git_apply_location_t;
131
132 /**
133 * Apply a `git_diff` to the given repository, making changes directly
134 * in the working directory, the index, or both.
135 *
136 * @param repo the repository to apply to
137 * @param diff the diff to apply
138 * @param location the location to apply (workdir, index or both)
139 * @param options the options for the apply (or null for defaults)
140 */
141 GIT_EXTERN(int) git_apply(
142 git_repository *repo,
143 git_diff *diff,
144 git_apply_location_t location,
145 const git_apply_options *options);
146
147 /** @} */
148 GIT_END_DECL
149 #endif