completion: reduce overhead of clearing cached --options
[git] / convert.h
1 /*
2  * Copyright (c) 2011, Google Inc.
3  */
4 #ifndef CONVERT_H
5 #define CONVERT_H
6
7 #include "string-list.h"
8
9 struct index_state;
10
11 #define CONV_EOL_RNDTRP_DIE   (1<<0) /* Die if CRLF to LF to CRLF is different */
12 #define CONV_EOL_RNDTRP_WARN  (1<<1) /* Warn if CRLF to LF to CRLF is different */
13 #define CONV_EOL_RENORMALIZE  (1<<2) /* Convert CRLF to LF */
14 #define CONV_EOL_KEEP_CRLF    (1<<3) /* Keep CRLF line endings as is */
15
16 extern int global_conv_flags_eol;
17
18 enum auto_crlf {
19         AUTO_CRLF_FALSE = 0,
20         AUTO_CRLF_TRUE = 1,
21         AUTO_CRLF_INPUT = -1
22 };
23
24 extern enum auto_crlf auto_crlf;
25
26 enum eol {
27         EOL_UNSET,
28         EOL_CRLF,
29         EOL_LF,
30 #ifdef NATIVE_CRLF
31         EOL_NATIVE = EOL_CRLF
32 #else
33         EOL_NATIVE = EOL_LF
34 #endif
35 };
36
37 enum ce_delay_state {
38         CE_NO_DELAY = 0,
39         CE_CAN_DELAY = 1,
40         CE_RETRY = 2
41 };
42
43 struct delayed_checkout {
44         /*
45          * State of the currently processed cache entry. If the state is
46          * CE_CAN_DELAY, then the filter can delay the current cache entry.
47          * If the state is CE_RETRY, then this signals the filter that the
48          * cache entry was requested before.
49          */
50         enum ce_delay_state state;
51         /* List of filter drivers that signaled delayed blobs. */
52         struct string_list filters;
53         /* List of delayed blobs identified by their path. */
54         struct string_list paths;
55 };
56
57 extern enum eol core_eol;
58 extern const char *get_cached_convert_stats_ascii(const struct index_state *istate,
59                                                   const char *path);
60 extern const char *get_wt_convert_stats_ascii(const char *path);
61 extern const char *get_convert_attr_ascii(const char *path);
62
63 /* returns 1 if *dst was used */
64 extern int convert_to_git(const struct index_state *istate,
65                           const char *path, const char *src, size_t len,
66                           struct strbuf *dst, int conv_flags);
67 extern int convert_to_working_tree(const char *path, const char *src,
68                                    size_t len, struct strbuf *dst);
69 extern int async_convert_to_working_tree(const char *path, const char *src,
70                                          size_t len, struct strbuf *dst,
71                                          void *dco);
72 extern int async_query_available_blobs(const char *cmd, struct string_list *available_paths);
73 extern int renormalize_buffer(const struct index_state *istate,
74                               const char *path, const char *src, size_t len,
75                               struct strbuf *dst);
76 static inline int would_convert_to_git(const struct index_state *istate,
77                                        const char *path)
78 {
79         return convert_to_git(istate, path, NULL, 0, NULL, 0);
80 }
81 /* Precondition: would_convert_to_git_filter_fd(path) == true */
82 extern void convert_to_git_filter_fd(const struct index_state *istate,
83                                      const char *path, int fd,
84                                      struct strbuf *dst,
85                                      int conv_flags);
86 extern int would_convert_to_git_filter_fd(const char *path);
87
88 /*****************************************************************
89  *
90  * Streaming conversion support
91  *
92  *****************************************************************/
93
94 struct stream_filter; /* opaque */
95
96 extern struct stream_filter *get_stream_filter(const char *path, const unsigned char *);
97 extern void free_stream_filter(struct stream_filter *);
98 extern int is_null_stream_filter(struct stream_filter *);
99
100 /*
101  * Use as much input up to *isize_p and fill output up to *osize_p;
102  * update isize_p and osize_p to indicate how much buffer space was
103  * consumed and filled. Return 0 on success, non-zero on error.
104  *
105  * Some filters may need to buffer the input and look-ahead inside it
106  * to decide what to output, and they may consume more than zero bytes
107  * of input and still not produce any output. After feeding all the
108  * input, pass NULL as input and keep calling this function, to let
109  * such filters know there is no more input coming and it is time for
110  * them to produce the remaining output based on the buffered input.
111  */
112 extern int stream_filter(struct stream_filter *,
113                          const char *input, size_t *isize_p,
114                          char *output, size_t *osize_p);
115
116 #endif /* CONVERT_H */