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"
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_configmap _configmap_eol
[] = {
33 {GIT_CONFIGMAP_FALSE
, NULL
, GIT_EOL_UNSET
},
34 {GIT_CONFIGMAP_STRING
, "lf", GIT_EOL_LF
},
35 {GIT_CONFIGMAP_STRING
, "crlf", GIT_EOL_CRLF
},
36 {GIT_CONFIGMAP_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_configmap _configmap_autocrlf
[] = {
50 {GIT_CONFIGMAP_FALSE
, NULL
, GIT_AUTO_CRLF_FALSE
},
51 {GIT_CONFIGMAP_TRUE
, NULL
, GIT_AUTO_CRLF_TRUE
},
52 {GIT_CONFIGMAP_STRING
, "input", GIT_AUTO_CRLF_INPUT
}
55 static git_configmap _configmap_safecrlf
[] = {
56 {GIT_CONFIGMAP_FALSE
, NULL
, GIT_SAFE_CRLF_FALSE
},
57 {GIT_CONFIGMAP_TRUE
, NULL
, GIT_SAFE_CRLF_FAIL
},
58 {GIT_CONFIGMAP_STRING
, "warn", GIT_SAFE_CRLF_WARN
}
61 static git_configmap _configmap_logallrefupdates
[] = {
62 {GIT_CONFIGMAP_FALSE
, NULL
, GIT_LOGALLREFUPDATES_FALSE
},
63 {GIT_CONFIGMAP_TRUE
, NULL
, GIT_LOGALLREFUPDATES_TRUE
},
64 {GIT_CONFIGMAP_STRING
, "always", GIT_LOGALLREFUPDATES_ALWAYS
},
68 * Generic map for integer values
70 static git_configmap _configmap_int
[] = {
71 {GIT_CONFIGMAP_INT32
, NULL
, 0},
74 static struct map_data _configmaps
[] = {
75 {"core.autocrlf", _configmap_autocrlf
, ARRAY_SIZE(_configmap_autocrlf
), GIT_AUTO_CRLF_DEFAULT
},
76 {"core.eol", _configmap_eol
, ARRAY_SIZE(_configmap_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", _configmap_int
, 1, GIT_ABBREV_DEFAULT
},
83 {"core.precomposeunicode", NULL
, 0, GIT_PRECOMPOSE_DEFAULT
},
84 {"core.safecrlf", _configmap_safecrlf
, ARRAY_SIZE(_configmap_safecrlf
), GIT_SAFE_CRLF_DEFAULT
},
85 {"core.logallrefupdates", _configmap_logallrefupdates
, ARRAY_SIZE(_configmap_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
},
89 {"core.longpaths", NULL
, 0, GIT_LONGPATHS_DEFAULT
},
92 int git_config__configmap_lookup(int *out
, git_config
*config
, git_configmap_item item
)
95 struct map_data
*data
= &_configmaps
[(int)item
];
96 git_config_entry
*entry
;
98 if ((error
= git_config__lookup_entry(&entry
, config
, data
->name
, false)) < 0)
102 *out
= data
->default_value
;
104 error
= git_config_lookup_map_value(
105 out
, data
->maps
, data
->map_count
, entry
->value
);
107 error
= git_config_parse_bool(out
, entry
->value
);
109 git_config_entry_free(entry
);
113 int git_repository__configmap_lookup(int *out
, git_repository
*repo
, git_configmap_item item
)
115 intptr_t value
= (intptr_t)git_atomic_load(repo
->configmap_cache
[(int)item
]);
119 if (value
== GIT_CONFIGMAP_NOT_CACHED
) {
121 intptr_t oldval
= value
;
124 if ((error
= git_repository_config__weakptr(&config
, repo
)) < 0 ||
125 (error
= git_config__configmap_lookup(out
, config
, item
)) < 0)
129 git_atomic_compare_and_swap(&repo
->configmap_cache
[(int)item
], (void *)oldval
, (void *)value
);
135 void git_repository__configmap_lookup_cache_clear(git_repository
*repo
)
139 for (i
= 0; i
< GIT_CONFIGMAP_CACHE_MAX
; ++i
)
140 repo
->configmap_cache
[i
] = GIT_CONFIGMAP_NOT_CACHED
;