diff options
| author | Patrick Steinhardt <ps@pks.im> | 2017-03-15 13:38:54 +0100 |
|---|---|---|
| committer | Patrick Steinhardt <ps@pks.im> | 2017-03-17 09:27:56 +0100 |
| commit | b0c9bc920fabfd814946d555738ac7ba042154d7 (patch) | |
| tree | 013a5166f03bf4dd1daf90bc4e76d69213e4ea2e /src/submodule.c | |
| parent | 097f0105b4f49be3f26273f2323a5b39404180db (diff) | |
| download | libgit2-b0c9bc920fabfd814946d555738ac7ba042154d7.tar.gz | |
submodule: resolve URLs relative to main worktree
It is possible to specify submodule URLs relative to the repository
location. E.g. having a submodule with URL "../submodule" will look for
the submodule at "repo/../submodule".
With the introduction of worktrees, though, we cannot simply resolve the
URL relative to the repository location itself. If the repository for
which a URL is to be resolved is a working tree, we have to resolve the
URL relative to the parent's repository path. Otherwise, the URL would
change depending on where the working tree is located.
Fix this by special-casing when we have a working tree while getting the
URL base.
Diffstat (limited to 'src/submodule.c')
| -rw-r--r-- | src/submodule.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/src/submodule.c b/src/submodule.c index 095bbb090..ff65591d2 100644 --- a/src/submodule.c +++ b/src/submodule.c @@ -22,6 +22,7 @@ #include "iterator.h" #include "path.h" #include "index.h" +#include "worktree.h" #define GIT_MODULES_FILE ".gitmodules" @@ -2030,17 +2031,28 @@ static int lookup_default_remote(git_remote **remote, git_repository *repo) static int get_url_base(git_buf *url, git_repository *repo) { int error; + git_worktree *wt = NULL; git_remote *remote = NULL; - if (!(error = lookup_default_remote(&remote, repo))) { + if ((error = lookup_default_remote(&remote, repo)) == 0) { error = git_buf_sets(url, git_remote_url(remote)); - git_remote_free(remote); - } - else if (error == GIT_ENOTFOUND) { - /* if repository does not have a default remote, use workdir instead */ + goto out; + } else if (error != GIT_ENOTFOUND) + goto out; + else giterr_clear(); + + /* if repository does not have a default remote, use workdir instead */ + if (git_repository_is_worktree(repo)) { + if ((error = git_worktree_open_from_repository(&wt, repo)) < 0) + goto out; + error = git_buf_sets(url, wt->parent_path); + } else error = git_buf_sets(url, git_repository_workdir(repo)); - } + +out: + git_remote_free(remote); + git_worktree_free(wt); return error; } |
