08c0a252cbe898f087107123ea10bb142f8d43b2
   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 void 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