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.
11 #include "repository.h"
13 #include "git2/config.h"
18 const char *cvar_name
;
26 * Sets the line ending type to use in the working directory for
27 * files that have the text property set. Alternatives are lf, crlf
28 * and native, which uses the platform's native line ending. The default
29 * value is native. See gitattributes(5) for more information on
30 * end-of-line conversion.
32 static git_cvar_map _cvar_map_eol
[] = {
33 {GIT_CVAR_FALSE
, NULL
, GIT_EOL_UNSET
},
34 {GIT_CVAR_STRING
, "lf", GIT_EOL_LF
},
35 {GIT_CVAR_STRING
, "crlf", GIT_EOL_CRLF
},
36 {GIT_CVAR_STRING
, "native", GIT_EOL_NATIVE
}
41 * Setting this variable to "true" is almost the same as setting
42 * the text attribute to "auto" on all files except that text files are
43 * not guaranteed to be normalized: files that contain CRLF in the
44 * repository will not be touched. Use this setting if you want to have
45 * CRLF line endings in your working directory even though the repository
46 * does not have normalized line endings. This variable can be set to input,
47 * in which case no output conversion is performed.
49 static git_cvar_map _cvar_map_autocrlf
[] = {
50 {GIT_CVAR_FALSE
, NULL
, GIT_AUTO_CRLF_FALSE
},
51 {GIT_CVAR_TRUE
, NULL
, GIT_AUTO_CRLF_TRUE
},
52 {GIT_CVAR_STRING
, "input", GIT_AUTO_CRLF_INPUT
}
55 static git_cvar_map _cvar_map_safecrlf
[] = {
56 {GIT_CVAR_FALSE
, NULL
, GIT_SAFE_CRLF_FALSE
},
57 {GIT_CVAR_TRUE
, NULL
, GIT_SAFE_CRLF_FAIL
},
58 {GIT_CVAR_STRING
, "warn", GIT_SAFE_CRLF_WARN
}
61 static git_cvar_map _cvar_map_logallrefupdates
[] = {
62 {GIT_CVAR_FALSE
, NULL
, GIT_LOGALLREFUPDATES_FALSE
},
63 {GIT_CVAR_TRUE
, NULL
, GIT_LOGALLREFUPDATES_TRUE
},
64 {GIT_CVAR_STRING
, "always", GIT_LOGALLREFUPDATES_ALWAYS
},
68 * Generic map for integer values
70 static git_cvar_map _cvar_map_int
[] = {
71 {GIT_CVAR_INT32
, NULL
, 0},
74 static struct map_data _cvar_maps
[] = {
75 {"core.autocrlf", _cvar_map_autocrlf
, ARRAY_SIZE(_cvar_map_autocrlf
), GIT_AUTO_CRLF_DEFAULT
},
76 {"core.eol", _cvar_map_eol
, ARRAY_SIZE(_cvar_map_eol
), GIT_EOL_DEFAULT
},
77 {"core.symlinks", NULL
, 0, GIT_SYMLINKS_DEFAULT
},
78 {"core.ignorecase", NULL
, 0, GIT_IGNORECASE_DEFAULT
},
79 {"core.filemode", NULL
, 0, GIT_FILEMODE_DEFAULT
},
80 {"core.ignorestat", NULL
, 0, GIT_IGNORESTAT_DEFAULT
},
81 {"core.trustctime", NULL
, 0, GIT_TRUSTCTIME_DEFAULT
},
82 {"core.abbrev", _cvar_map_int
, 1, GIT_ABBREV_DEFAULT
},
83 {"core.precomposeunicode", NULL
, 0, GIT_PRECOMPOSE_DEFAULT
},
84 {"core.safecrlf", _cvar_map_safecrlf
, ARRAY_SIZE(_cvar_map_safecrlf
), GIT_SAFE_CRLF_DEFAULT
},
85 {"core.logallrefupdates", _cvar_map_logallrefupdates
, ARRAY_SIZE(_cvar_map_logallrefupdates
), GIT_LOGALLREFUPDATES_DEFAULT
},
86 {"core.protecthfs", NULL
, 0, GIT_PROTECTHFS_DEFAULT
},
87 {"core.protectntfs", NULL
, 0, GIT_PROTECTNTFS_DEFAULT
},
88 {"core.fsyncobjectfiles", NULL
, 0, GIT_FSYNCOBJECTFILES_DEFAULT
},
91 int git_config__cvar(int *out
, git_config
*config
, git_cvar_cached cvar
)
94 struct map_data
*data
= &_cvar_maps
[(int)cvar
];
95 git_config_entry
*entry
;
97 if ((error
= git_config__lookup_entry(&entry
, config
, data
->cvar_name
, false)) < 0)
101 *out
= data
->default_value
;
103 error
= git_config_lookup_map_value(
104 out
, data
->maps
, data
->map_count
, entry
->value
);
106 error
= git_config_parse_bool(out
, entry
->value
);
108 git_config_entry_free(entry
);
112 int git_repository__cvar(int *out
, git_repository
*repo
, git_cvar_cached cvar
)
114 *out
= repo
->cvar_cache
[(int)cvar
];
116 if (*out
== GIT_CVAR_NOT_CACHED
) {
120 if ((error
= git_repository_config__weakptr(&config
, repo
)) < 0 ||
121 (error
= git_config__cvar(out
, config
, cvar
)) < 0)
124 repo
->cvar_cache
[(int)cvar
] = *out
;
130 void git_repository__cvar_cache_clear(git_repository
*repo
)
134 for (i
= 0; i
< GIT_CVAR_CACHE_MAX
; ++i
)
135 repo
->cvar_cache
[i
] = GIT_CVAR_NOT_CACHED
;