diff options
-rw-r--r-- | src/repository.c | 34 | ||||
-rw-r--r-- | src/repository.h | 6 |
2 files changed, 40 insertions, 0 deletions
diff --git a/src/repository.c b/src/repository.c index f7789127a..e4a374d12 100644 --- a/src/repository.c +++ b/src/repository.c @@ -2354,6 +2354,40 @@ static int repo_contains_no_reference(git_repository *repo) return error; } +int git_repository_initialbranch(git_buf *out, git_repository *repo) +{ + git_config *config; + git_config_entry *entry = NULL; + const char *branch; + int error; + + if ((error = git_repository_config__weakptr(&config, repo)) < 0) + return error; + + if ((error = git_config_get_entry(&entry, config, "init.defaultbranch")) == 0) { + branch = entry->value; + } + else if (error == GIT_ENOTFOUND) { + branch = GIT_BRANCH_DEFAULT; + } + else { + goto done; + } + + if ((error = git_buf_puts(out, GIT_REFS_HEADS_DIR)) < 0 || + (error = git_buf_puts(out, branch)) < 0) + goto done; + + if (!git_reference_is_valid_name(out->ptr)) { + git_error_set(GIT_ERROR_INVALID, "the value of init.defaultBranch is not a valid reference name"); + error = -1; + } + +done: + git_config_entry_free(entry); + return error; +} + int git_repository_is_empty(git_repository *repo) { git_reference *head = NULL; diff --git a/src/repository.h b/src/repository.h index d73e77d70..de009ba5e 100644 --- a/src/repository.h +++ b/src/repository.h @@ -232,4 +232,10 @@ extern size_t git_repository__reserved_names_posix_len; bool git_repository__reserved_names( git_buf **out, size_t *outlen, git_repository *repo, bool include_ntfs); +/* + * The default branch for the repository; the `init.defaultBranch` + * configuration option, if set, or `master` if it is not. + */ +int git_repository_initialbranch(git_buf *out, git_repository *repo); + #endif |