2 * Copyright (C) the libgit2 contributors. All rights reserved.
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.
10 #include "repository.h"
12 #include "git2/config.h"
17 const char *cvar_name
;
25 * Sets the line ending type to use in the working directory for
26 * files that have the text property set. Alternatives are lf, crlf
27 * and native, which uses the platform's native line ending. The default
28 * value is native. See gitattributes(5) for more information on
29 * end-of-line conversion.
31 static git_cvar_map _cvar_map_eol
[] = {
32 {GIT_CVAR_FALSE
, NULL
, GIT_EOL_UNSET
},
33 {GIT_CVAR_STRING
, "lf", GIT_EOL_LF
},
34 {GIT_CVAR_STRING
, "crlf", GIT_EOL_CRLF
},
35 {GIT_CVAR_STRING
, "native", GIT_EOL_NATIVE
}
40 * Setting this variable to "true" is almost the same as setting
41 * the text attribute to "auto" on all files except that text files are
42 * not guaranteed to be normalized: files that contain CRLF in the
43 * repository will not be touched. Use this setting if you want to have
44 * CRLF line endings in your working directory even though the repository
45 * does not have normalized line endings. This variable can be set to input,
46 * in which case no output conversion is performed.
48 static git_cvar_map _cvar_map_autocrlf
[] = {
49 {GIT_CVAR_FALSE
, NULL
, GIT_AUTO_CRLF_FALSE
},
50 {GIT_CVAR_TRUE
, NULL
, GIT_AUTO_CRLF_TRUE
},
51 {GIT_CVAR_STRING
, "input", GIT_AUTO_CRLF_INPUT
}
54 static git_cvar_map _cvar_map_safecrlf
[] = {
55 {GIT_CVAR_FALSE
, NULL
, GIT_SAFE_CRLF_FALSE
},
56 {GIT_CVAR_TRUE
, NULL
, GIT_SAFE_CRLF_FAIL
},
57 {GIT_CVAR_STRING
, "warn", GIT_SAFE_CRLF_WARN
}
61 * Generic map for integer values
63 static git_cvar_map _cvar_map_int
[] = {
64 {GIT_CVAR_INT32
, NULL
, 0},
67 static struct map_data _cvar_maps
[] = {
68 {"core.autocrlf", _cvar_map_autocrlf
, ARRAY_SIZE(_cvar_map_autocrlf
), GIT_AUTO_CRLF_DEFAULT
},
69 {"core.eol", _cvar_map_eol
, ARRAY_SIZE(_cvar_map_eol
), GIT_EOL_DEFAULT
},
70 {"core.symlinks", NULL
, 0, GIT_SYMLINKS_DEFAULT
},
71 {"core.ignorecase", NULL
, 0, GIT_IGNORECASE_DEFAULT
},
72 {"core.filemode", NULL
, 0, GIT_FILEMODE_DEFAULT
},
73 {"core.ignorestat", NULL
, 0, GIT_IGNORESTAT_DEFAULT
},
74 {"core.trustctime", NULL
, 0, GIT_TRUSTCTIME_DEFAULT
},
75 {"core.abbrev", _cvar_map_int
, 1, GIT_ABBREV_DEFAULT
},
76 {"core.precomposeunicode", NULL
, 0, GIT_PRECOMPOSE_DEFAULT
},
77 {"core.safecrlf", _cvar_map_safecrlf
, ARRAY_SIZE(_cvar_map_safecrlf
), GIT_SAFE_CRLF_DEFAULT
},
78 {"core.logallrefupdates", NULL
, 0, GIT_LOGALLREFUPDATES_DEFAULT
},
79 {"core.protecthfs", NULL
, 0, GIT_PROTECTHFS_DEFAULT
},
80 {"core.protectntfs", NULL
, 0, GIT_PROTECTNTFS_DEFAULT
},
83 int git_config__cvar(int *out
, git_config
*config
, git_cvar_cached cvar
)
86 struct map_data
*data
= &_cvar_maps
[(int)cvar
];
87 git_config_entry
*entry
;
89 git_config__lookup_entry(&entry
, config
, data
->cvar_name
, false);
92 *out
= data
->default_value
;
94 error
= git_config_lookup_map_value(
95 out
, data
->maps
, data
->map_count
, entry
->value
);
97 error
= git_config_parse_bool(out
, entry
->value
);
99 git_config_entry_free(entry
);
103 int git_repository__cvar(int *out
, git_repository
*repo
, git_cvar_cached cvar
)
105 *out
= repo
->cvar_cache
[(int)cvar
];
107 if (*out
== GIT_CVAR_NOT_CACHED
) {
111 if ((error
= git_repository_config__weakptr(&config
, repo
)) < 0 ||
112 (error
= git_config__cvar(out
, config
, cvar
)) < 0)
115 repo
->cvar_cache
[(int)cvar
] = *out
;
121 void git_repository__cvar_cache_clear(git_repository
*repo
)
125 for (i
= 0; i
< GIT_CVAR_CACHE_MAX
; ++i
)
126 repo
->cvar_cache
[i
] = GIT_CVAR_NOT_CACHED
;