diff options
author | nulltoken <emeric.fermas@gmail.com> | 2012-06-05 14:29:10 +0200 |
---|---|---|
committer | nulltoken <emeric.fermas@gmail.com> | 2012-06-05 22:33:34 +0200 |
commit | 693b23c09aef65a53d4523357be44654b4533065 (patch) | |
tree | ebce1b54746b5fed16e56d5e57bab1900b02adb8 /src | |
parent | fac66990b6ed5173ae89458f32d456458c086b1a (diff) | |
download | libgit2-693b23c09aef65a53d4523357be44654b4533065.tar.gz |
repository: make git_repository_init() value the core.ignorecase config entry
Diffstat (limited to 'src')
-rw-r--r-- | src/repository.c | 50 |
1 files changed, 38 insertions, 12 deletions
diff --git a/src/repository.c b/src/repository.c index 5ee64cdc8..718170839 100644 --- a/src/repository.c +++ b/src/repository.c @@ -676,7 +676,25 @@ static bool is_chmod_supported(const char *file_path) return _is_supported; } -static int repo_init_config(const char *git_dir, int is_bare) +static bool is_filesystem_case_insensitive(const char *gitdir_path) +{ + git_buf path = GIT_BUF_INIT; + static int _is_insensitive = -1; + + if (_is_insensitive > -1) + return _is_insensitive; + + if (git_buf_joinpath(&path, gitdir_path, "CoNfIg") < 0) + goto cleanup; + + _is_insensitive = git_path_exists(git_buf_cstr(&path)); + +cleanup: + git_buf_free(&path); + return _is_insensitive; +} + +static int repo_init_config(const char *git_dir, bool is_bare, bool is_reinit) { git_buf cfg_path = GIT_BUF_INIT; git_config *config = NULL; @@ -699,6 +717,9 @@ static int repo_init_config(const char *git_dir, int is_bare) SET_REPO_CONFIG(bool, "core.bare", is_bare); SET_REPO_CONFIG(int32, "core.repositoryformatversion", GIT_REPO_VERSION); SET_REPO_CONFIG(bool, "core.filemode", is_chmod_supported(git_buf_cstr(&cfg_path))); + + if (!is_reinit && is_filesystem_case_insensitive(git_dir)) + SET_REPO_CONFIG(bool, "core.ignorecase", true); /* TODO: what other defaults? */ git_buf_free(&cfg_path); @@ -812,30 +833,35 @@ static int repo_init_structure(const char *git_dir, int is_bare) int git_repository_init(git_repository **repo_out, const char *path, unsigned is_bare) { git_buf repository_path = GIT_BUF_INIT; + bool is_reinit; + int result = -1; assert(repo_out && path); if (git_buf_joinpath(&repository_path, path, is_bare ? "" : GIT_DIR) < 0) - return -1; + goto cleanup; - if (git_path_isdir(repository_path.ptr) == true) { - if (valid_repository_path(&repository_path) == true) { - int res = repo_init_reinit(repo_out, repository_path.ptr, is_bare); - git_buf_free(&repository_path); - return res; - } + is_reinit = git_path_isdir(repository_path.ptr) && valid_repository_path(&repository_path); + + if (is_reinit) { + if (repo_init_reinit(repo_out, repository_path.ptr, is_bare) < 0) + goto cleanup; + + result = repo_init_config(repository_path.ptr, is_bare, is_reinit); } if (repo_init_structure(repository_path.ptr, is_bare) < 0 || - repo_init_config(repository_path.ptr, is_bare) < 0 || + repo_init_config(repository_path.ptr, is_bare, is_reinit) < 0 || repo_init_createhead(repository_path.ptr) < 0 || git_repository_open(repo_out, repository_path.ptr) < 0) { - git_buf_free(&repository_path); - return -1; + goto cleanup; } + result = 0; + +cleanup: git_buf_free(&repository_path); - return 0; + return result; } int git_repository_head_detached(git_repository *repo) |