Christian Couder | 71501a7 | 2016-08-08 23:02:59 +0200 | [diff] [blame] | 1 | #ifndef APPLY_H |
| 2 | #define APPLY_H |
| 3 | |
Denton Liu | 97b989e | 2019-09-25 01:20:53 -0700 | [diff] [blame] | 4 | #include "hash.h" |
Elijah Newren | ef3ca95 | 2018-08-15 10:54:05 -0700 | [diff] [blame] | 5 | #include "lockfile.h" |
| 6 | #include "string-list.h" |
| 7 | |
Nguyễn Thái Ngọc Duy | 82ea77e | 2018-08-13 18:14:39 +0200 | [diff] [blame] | 8 | struct repository; |
| 9 | |
Christian Couder | 71501a7 | 2016-08-08 23:02:59 +0200 | [diff] [blame] | 10 | enum apply_ws_error_action { |
| 11 | nowarn_ws_error, |
| 12 | warn_on_ws_error, |
| 13 | die_on_ws_error, |
| 14 | correct_ws_error |
| 15 | }; |
| 16 | |
| 17 | enum apply_ws_ignore { |
| 18 | ignore_ws_none, |
| 19 | ignore_ws_change |
| 20 | }; |
| 21 | |
Christian Couder | a46160d | 2016-09-04 22:18:25 +0200 | [diff] [blame] | 22 | enum apply_verbosity { |
| 23 | verbosity_silent = -1, |
| 24 | verbosity_normal = 0, |
| 25 | verbosity_verbose = 1 |
| 26 | }; |
| 27 | |
Christian Couder | 71501a7 | 2016-08-08 23:02:59 +0200 | [diff] [blame] | 28 | /* |
| 29 | * We need to keep track of how symlinks in the preimage are |
| 30 | * manipulated by the patches. A patch to add a/b/c where a/b |
| 31 | * is a symlink should not be allowed to affect the directory |
| 32 | * the symlink points at, but if the same patch removes a/b, |
| 33 | * it is perfectly fine, as the patch removes a/b to make room |
| 34 | * to create a directory a/b so that a/b/c can be created. |
| 35 | * |
| 36 | * See also "struct string_list symlink_changes" in "struct |
| 37 | * apply_state". |
| 38 | */ |
| 39 | #define APPLY_SYMLINK_GOES_AWAY 01 |
| 40 | #define APPLY_SYMLINK_IN_RESULT 02 |
| 41 | |
| 42 | struct apply_state { |
| 43 | const char *prefix; |
Christian Couder | 71501a7 | 2016-08-08 23:02:59 +0200 | [diff] [blame] | 44 | |
Martin Ågren | d13cd4c | 2017-10-05 22:32:10 +0200 | [diff] [blame] | 45 | /* Lock file */ |
Martin Ågren | 6d058c8 | 2017-10-05 22:32:09 +0200 | [diff] [blame] | 46 | struct lock_file lock_file; |
Christian Couder | 71501a7 | 2016-08-08 23:02:59 +0200 | [diff] [blame] | 47 | |
| 48 | /* These control what gets looked at and modified */ |
| 49 | int apply; /* this is not a dry-run */ |
| 50 | int cached; /* apply to the index only */ |
| 51 | int check; /* preimage must match working tree, don't actually apply */ |
| 52 | int check_index; /* preimage must match the indexed version */ |
| 53 | int update_index; /* check_index && apply */ |
Nguyễn Thái Ngọc Duy | cff5dc0 | 2018-05-26 14:08:46 +0200 | [diff] [blame] | 54 | int ita_only; /* add intent-to-add entries to the index */ |
Christian Couder | 71501a7 | 2016-08-08 23:02:59 +0200 | [diff] [blame] | 55 | |
| 56 | /* These control cosmetic aspect of the output */ |
| 57 | int diffstat; /* just show a diffstat, and don't actually apply */ |
| 58 | int numstat; /* just show a numeric diffstat, and don't actually apply */ |
| 59 | int summary; /* just report creation, deletion, etc, and don't actually apply */ |
| 60 | |
| 61 | /* These boolean parameters control how the apply is done */ |
| 62 | int allow_overlap; |
| 63 | int apply_in_reverse; |
| 64 | int apply_with_reject; |
Christian Couder | 71501a7 | 2016-08-08 23:02:59 +0200 | [diff] [blame] | 65 | int no_add; |
| 66 | int threeway; |
| 67 | int unidiff_zero; |
| 68 | int unsafe_paths; |
| 69 | |
| 70 | /* Other non boolean parameters */ |
Nguyễn Thái Ngọc Duy | 82ea77e | 2018-08-13 18:14:39 +0200 | [diff] [blame] | 71 | struct repository *repo; |
Christian Couder | 5b0b57f | 2016-09-04 22:18:32 +0200 | [diff] [blame] | 72 | const char *index_file; |
Christian Couder | a46160d | 2016-09-04 22:18:25 +0200 | [diff] [blame] | 73 | enum apply_verbosity apply_verbosity; |
Christian Couder | 71501a7 | 2016-08-08 23:02:59 +0200 | [diff] [blame] | 74 | const char *fake_ancestor; |
| 75 | const char *patch_input_file; |
| 76 | int line_termination; |
| 77 | struct strbuf root; |
| 78 | int p_value; |
| 79 | int p_value_known; |
| 80 | unsigned int p_context; |
| 81 | |
| 82 | /* Exclude and include path parameters */ |
| 83 | struct string_list limit_by_name; |
| 84 | int has_include; |
| 85 | |
| 86 | /* Various "current state" */ |
| 87 | int linenr; /* current line number */ |
| 88 | struct string_list symlink_changes; /* we have to track symlinks */ |
| 89 | |
| 90 | /* |
| 91 | * For "diff-stat" like behaviour, we keep track of the biggest change |
| 92 | * we've seen, and the longest filename. That allows us to do simple |
| 93 | * scaling. |
| 94 | */ |
| 95 | int max_change; |
| 96 | int max_len; |
| 97 | |
| 98 | /* |
| 99 | * Records filenames that have been touched, in order to handle |
| 100 | * the case where more than one patches touch the same file. |
| 101 | */ |
| 102 | struct string_list fn_table; |
| 103 | |
Christian Couder | 45b78d8 | 2016-09-04 22:18:29 +0200 | [diff] [blame] | 104 | /* |
| 105 | * This is to save reporting routines before using |
| 106 | * set_error_routine() or set_warn_routine() to install muting |
| 107 | * routines when in verbosity_silent mode. |
| 108 | */ |
| 109 | void (*saved_error_routine)(const char *err, va_list params); |
| 110 | void (*saved_warn_routine)(const char *warn, va_list params); |
| 111 | |
Christian Couder | 71501a7 | 2016-08-08 23:02:59 +0200 | [diff] [blame] | 112 | /* These control whitespace errors */ |
| 113 | enum apply_ws_error_action ws_error_action; |
| 114 | enum apply_ws_ignore ws_ignore_action; |
| 115 | const char *whitespace_option; |
| 116 | int whitespace_error; |
| 117 | int squelch_whitespace_errors; |
| 118 | int applied_after_fixing_ws; |
| 119 | }; |
| 120 | |
Thomas Gummerer | ef283b3 | 2019-07-11 17:08:44 +0100 | [diff] [blame] | 121 | /* |
| 122 | * This represents a "patch" to a file, both metainfo changes |
| 123 | * such as creation/deletion, filemode and content changes represented |
| 124 | * as a series of fragments. |
| 125 | */ |
| 126 | struct patch { |
| 127 | char *new_name, *old_name, *def_name; |
| 128 | unsigned int old_mode, new_mode; |
| 129 | int is_new, is_delete; /* -1 = unknown, 0 = false, 1 = true */ |
| 130 | int rejected; |
| 131 | unsigned ws_rule; |
| 132 | int lines_added, lines_deleted; |
| 133 | int score; |
| 134 | int extension_linenr; /* first line specifying delete/new/rename/copy */ |
| 135 | unsigned int is_toplevel_relative:1; |
| 136 | unsigned int inaccurate_eof:1; |
| 137 | unsigned int is_binary:1; |
| 138 | unsigned int is_copy:1; |
| 139 | unsigned int is_rename:1; |
| 140 | unsigned int recount:1; |
| 141 | unsigned int conflicted_threeway:1; |
| 142 | unsigned int direct_to_threeway:1; |
| 143 | unsigned int crlf_in_old:1; |
| 144 | struct fragment *fragments; |
| 145 | char *result; |
| 146 | size_t resultsize; |
| 147 | char old_oid_prefix[GIT_MAX_HEXSZ + 1]; |
| 148 | char new_oid_prefix[GIT_MAX_HEXSZ + 1]; |
| 149 | struct patch *next; |
| 150 | |
| 151 | /* three-way fallback result */ |
| 152 | struct object_id threeway_stage[3]; |
| 153 | }; |
| 154 | |
Nguyễn Thái Ngọc Duy | 45635ec | 2018-06-30 11:20:20 +0200 | [diff] [blame] | 155 | int apply_parse_options(int argc, const char **argv, |
| 156 | struct apply_state *state, |
| 157 | int *force_apply, int *options, |
| 158 | const char * const *apply_usage); |
| 159 | int init_apply_state(struct apply_state *state, |
Nguyễn Thái Ngọc Duy | 82ea77e | 2018-08-13 18:14:39 +0200 | [diff] [blame] | 160 | struct repository *repo, |
Nguyễn Thái Ngọc Duy | 45635ec | 2018-06-30 11:20:20 +0200 | [diff] [blame] | 161 | const char *prefix); |
| 162 | void clear_apply_state(struct apply_state *state); |
| 163 | int check_apply_state(struct apply_state *state, int force_apply); |
Christian Couder | bb493a5 | 2016-08-08 23:03:07 +0200 | [diff] [blame] | 164 | |
Christian Couder | 803bf4e | 2016-09-04 22:18:21 +0200 | [diff] [blame] | 165 | /* |
Thomas Gummerer | ef283b3 | 2019-07-11 17:08:44 +0100 | [diff] [blame] | 166 | * Parse a git diff header, starting at line. Fills the relevant |
| 167 | * metadata information in 'struct patch'. |
| 168 | * |
| 169 | * Returns -1 on failure, the length of the parsed header otherwise. |
| 170 | */ |
| 171 | int parse_git_diff_header(struct strbuf *root, |
| 172 | int *linenr, |
| 173 | int p_value, |
| 174 | const char *line, |
| 175 | int len, |
| 176 | unsigned int size, |
| 177 | struct patch *patch); |
| 178 | |
| 179 | /* |
Christian Couder | 803bf4e | 2016-09-04 22:18:21 +0200 | [diff] [blame] | 180 | * Some aspects of the apply behavior are controlled by the following |
| 181 | * bits in the "options" parameter passed to apply_all_patches(). |
| 182 | */ |
| 183 | #define APPLY_OPT_INACCURATE_EOF (1<<0) /* accept inaccurate eof */ |
| 184 | #define APPLY_OPT_RECOUNT (1<<1) /* accept inaccurate line count */ |
| 185 | |
Nguyễn Thái Ngọc Duy | 45635ec | 2018-06-30 11:20:20 +0200 | [diff] [blame] | 186 | int apply_all_patches(struct apply_state *state, |
| 187 | int argc, const char **argv, |
| 188 | int options); |
Christian Couder | 13b5af2 | 2016-04-22 20:55:46 +0200 | [diff] [blame] | 189 | |
Christian Couder | 71501a7 | 2016-08-08 23:02:59 +0200 | [diff] [blame] | 190 | #endif |