1#ifndef APPLY_H 2#define APPLY_H 3 4enum apply_ws_error_action { 5 nowarn_ws_error, 6 warn_on_ws_error, 7 die_on_ws_error, 8 correct_ws_error 9}; 10 11enum apply_ws_ignore { 12 ignore_ws_none, 13 ignore_ws_change 14}; 15 16/* 17 * We need to keep track of how symlinks in the preimage are 18 * manipulated by the patches. A patch to add a/b/c where a/b 19 * is a symlink should not be allowed to affect the directory 20 * the symlink points at, but if the same patch removes a/b, 21 * it is perfectly fine, as the patch removes a/b to make room 22 * to create a directory a/b so that a/b/c can be created. 23 * 24 * See also "struct string_list symlink_changes" in "struct 25 * apply_state". 26 */ 27#define APPLY_SYMLINK_GOES_AWAY 01 28#define APPLY_SYMLINK_IN_RESULT 02 29 30struct apply_state { 31 const char *prefix; 32 int prefix_length; 33 34 /* These are lock_file related */ 35 struct lock_file *lock_file; 36 int newfd; 37 38 /* These control what gets looked at and modified */ 39 int apply; /* this is not a dry-run */ 40 int cached; /* apply to the index only */ 41 int check; /* preimage must match working tree, don't actually apply */ 42 int check_index; /* preimage must match the indexed version */ 43 int update_index; /* check_index && apply */ 44 45 /* These control cosmetic aspect of the output */ 46 int diffstat; /* just show a diffstat, and don't actually apply */ 47 int numstat; /* just show a numeric diffstat, and don't actually apply */ 48 int summary; /* just report creation, deletion, etc, and don't actually apply */ 49 50 /* These boolean parameters control how the apply is done */ 51 int allow_overlap; 52 int apply_in_reverse; 53 int apply_with_reject; 54 int apply_verbosely; 55 int no_add; 56 int threeway; 57 int unidiff_zero; 58 int unsafe_paths; 59 60 /* Other non boolean parameters */ 61 const char *fake_ancestor; 62 const char *patch_input_file; 63 int line_termination; 64 struct strbuf root; 65 int p_value; 66 int p_value_known; 67 unsigned int p_context; 68 69 /* Exclude and include path parameters */ 70 struct string_list limit_by_name; 71 int has_include; 72 73 /* Various "current state" */ 74 int linenr; /* current line number */ 75 struct string_list symlink_changes; /* we have to track symlinks */ 76 77 /* 78 * For "diff-stat" like behaviour, we keep track of the biggest change 79 * we've seen, and the longest filename. That allows us to do simple 80 * scaling. 81 */ 82 int max_change; 83 int max_len; 84 85 /* 86 * Records filenames that have been touched, in order to handle 87 * the case where more than one patches touch the same file. 88 */ 89 struct string_list fn_table; 90 91 /* These control whitespace errors */ 92 enum apply_ws_error_action ws_error_action; 93 enum apply_ws_ignore ws_ignore_action; 94 const char *whitespace_option; 95 int whitespace_error; 96 int squelch_whitespace_errors; 97 int applied_after_fixing_ws; 98}; 99 100extern int parse_whitespace_option(struct apply_state *state, 101 const char *option); 102extern int parse_ignorewhitespace_option(struct apply_state *state, 103 const char *option); 104 105extern int init_apply_state(struct apply_state *state, 106 const char *prefix, 107 struct lock_file *lock_file); 108extern void clear_apply_state(struct apply_state *state); 109 110#endif