diff options
| author | Patrick Steinhardt <ps@pks.im> | 2016-11-11 13:46:59 +0100 |
|---|---|---|
| committer | Patrick Steinhardt <ps@pks.im> | 2017-02-13 10:28:15 +0100 |
| commit | cb3269c970db6766f8a953fee438b56119fd9847 (patch) | |
| tree | 2b172c6d0d765edc4d16ddbe953e0ea46c5a8ee3 /src | |
| parent | c09fd54e2ecb5d43c281ee0fccef6d95787ec510 (diff) | |
| download | libgit2-cb3269c970db6766f8a953fee438b56119fd9847.tar.gz | |
repository: add function to retrieve paths for repo items
Diffstat (limited to 'src')
| -rw-r--r-- | src/repository.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/repository.c b/src/repository.c index 71b6ec44f..14ad7a599 100644 --- a/src/repository.c +++ b/src/repository.c @@ -36,6 +36,27 @@ GIT__USE_STRMAP # include "win32/w32_util.h" #endif +static const struct { + git_repository_item_t parent; + const char *name; + bool directory; +} items[] = { + { GIT_REPOSITORY_ITEM_GITDIR, NULL, true }, + { GIT_REPOSITORY_ITEM_WORKDIR, NULL, true }, + { GIT_REPOSITORY_ITEM_COMMONDIR, NULL, true }, + { GIT_REPOSITORY_ITEM_GITDIR, "index", false }, + { GIT_REPOSITORY_ITEM_COMMONDIR, "objects", true }, + { GIT_REPOSITORY_ITEM_COMMONDIR, "refs", true }, + { GIT_REPOSITORY_ITEM_COMMONDIR, "packed-refs", false }, + { GIT_REPOSITORY_ITEM_COMMONDIR, "remotes", true }, + { GIT_REPOSITORY_ITEM_COMMONDIR, "config", false }, + { GIT_REPOSITORY_ITEM_COMMONDIR, "info", true }, + { GIT_REPOSITORY_ITEM_COMMONDIR, "hooks", true }, + { GIT_REPOSITORY_ITEM_COMMONDIR, "logs", true }, + { GIT_REPOSITORY_ITEM_GITDIR, "modules", true }, + { GIT_REPOSITORY_ITEM_COMMONDIR, "worktrees", true } +}; + static int check_repositoryformatversion(git_config *config); #define GIT_COMMONDIR_FILE "commondir" @@ -2052,6 +2073,46 @@ int git_repository_is_empty(git_repository *repo) return is_empty; } +int git_repository_item_path(git_buf *out, git_repository *repo, git_repository_item_t item) +{ + const char *parent; + + switch (items[item].parent) { + case GIT_REPOSITORY_ITEM_GITDIR: + parent = git_repository_path(repo); + break; + case GIT_REPOSITORY_ITEM_WORKDIR: + parent = git_repository_workdir(repo); + break; + case GIT_REPOSITORY_ITEM_COMMONDIR: + parent = git_repository_commondir(repo); + break; + default: + giterr_set(GITERR_INVALID, "Invalid item directory"); + return -1; + } + + if (parent == NULL) { + giterr_set(GITERR_INVALID, "Path cannot exist in repository"); + return -1; + } + + if (git_buf_sets(out, parent) < 0) + return -1; + + if (items[item].name) { + if (git_buf_joinpath(out, parent, items[item].name) < 0) + return -1; + } + + if (items[item].directory) { + if (git_path_to_dir(out) < 0) + return -1; + } + + return 0; +} + const char *git_repository_path(git_repository *repo) { assert(repo); |
