diff options
| -rw-r--r-- | include/git2/worktree.h | 18 | ||||
| -rw-r--r-- | src/worktree.c | 16 | ||||
| -rw-r--r-- | src/worktree.h | 2 | ||||
| -rw-r--r-- | tests/worktree/worktree.c | 23 |
4 files changed, 58 insertions, 1 deletions
diff --git a/include/git2/worktree.h b/include/git2/worktree.h index a2a5d4473..8ba5dcef0 100644 --- a/include/git2/worktree.h +++ b/include/git2/worktree.h @@ -149,6 +149,24 @@ GIT_EXTERN(int) git_worktree_unlock(git_worktree *wt); GIT_EXTERN(int) git_worktree_is_locked(git_buf *reason, const git_worktree *wt); /** + * Retrieve the name of the worktree + * + * @param wt Worktree to get the name for + * @return The worktree's name. The pointer returned is valid for the + * lifetime of the git_worktree + */ +GIT_EXTERN(const char *) git_worktree_name(const git_worktree *wt); + +/** + * Retrieve the filesystem path for the worktree + * + * @param wt Worktree to get the path for + * @return The worktree's filesystem path. The pointer returned + * is valid for the lifetime of the git_worktree. + */ +GIT_EXTERN(const char *) git_worktree_path(const git_worktree *wt); + +/** * Flags which can be passed to git_worktree_prune to alter its * behavior. */ diff --git a/src/worktree.c b/src/worktree.c index 4b18db7d6..898c23434 100644 --- a/src/worktree.c +++ b/src/worktree.c @@ -139,7 +139,8 @@ static int open_worktree_dir(git_worktree **out, const char *parent, const char if ((wt->name = git__strdup(name)) == NULL || (wt->commondir_path = git_worktree__read_link(dir, "commondir")) == NULL || (wt->gitlink_path = git_worktree__read_link(dir, "gitdir")) == NULL - || (wt->parent_path = git__strdup(parent)) == NULL) { + || (wt->parent_path = git__strdup(parent)) == NULL + || (wt->worktree_path = git_path_dirname(wt->gitlink_path)) == NULL) { error = -1; goto out; } @@ -223,6 +224,7 @@ void git_worktree_free(git_worktree *wt) return; git__free(wt->commondir_path); + git__free(wt->worktree_path); git__free(wt->gitlink_path); git__free(wt->gitdir_path); git__free(wt->parent_path); @@ -455,6 +457,18 @@ out: return ret; } +const char *git_worktree_name(const git_worktree *wt) +{ + assert(wt); + return wt->name; +} + +const char *git_worktree_path(const git_worktree *wt) +{ + assert(wt); + return wt->worktree_path; +} + int git_worktree_prune_init_options( git_worktree_prune_options *opts, unsigned int version) diff --git a/src/worktree.h b/src/worktree.h index 52d13cced..1d40c3a5d 100644 --- a/src/worktree.h +++ b/src/worktree.h @@ -18,6 +18,8 @@ struct git_worktree { * directory. */ char *name; + /* Path to the where the worktree lives in the filesystem */ + char *worktree_path; /* Path to the .git file in the working tree's repository */ char *gitlink_path; /* Path to the .git directory inside the parent's diff --git a/tests/worktree/worktree.c b/tests/worktree/worktree.c index 4ac3b8bba..abec1ec3d 100644 --- a/tests/worktree/worktree.c +++ b/tests/worktree/worktree.c @@ -355,6 +355,29 @@ void test_worktree_worktree__validate(void) git_worktree_free(wt); } +void test_worktree_worktree__name(void) +{ + git_worktree *wt; + + cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree")); + cl_assert_equal_s(git_worktree_name(wt), "testrepo-worktree"); + + git_worktree_free(wt); +} + +void test_worktree_worktree__path(void) +{ + git_worktree *wt; + git_buf expected_path = GIT_BUF_INIT; + + cl_git_pass(git_buf_joinpath(&expected_path, clar_sandbox_path(), "testrepo-worktree")); + cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree")); + cl_assert_equal_s(git_worktree_path(wt), expected_path.ptr); + + git_buf_free(&expected_path); + git_worktree_free(wt); +} + void test_worktree_worktree__validate_invalid_commondir(void) { git_worktree *wt; |
