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 150