mirror of
https://git.proxmox.com/git/libgit2
synced 2025-07-03 08:53:13 +00:00
Merge pull request #2399 from libgit2/cmn/path-to-path
clone: re-use the local transport's path resolution
This commit is contained in:
commit
90befde4a1
18
src/clone.c
18
src/clone.c
@ -472,11 +472,10 @@ static bool can_link(const char *src, const char *dst, int link)
|
|||||||
|
|
||||||
int git_clone_local_into(git_repository *repo, git_remote *remote, const git_checkout_options *co_opts, const char *branch, int link, const git_signature *signature)
|
int git_clone_local_into(git_repository *repo, git_remote *remote, const git_checkout_options *co_opts, const char *branch, int link, const git_signature *signature)
|
||||||
{
|
{
|
||||||
int error, root, flags;
|
int error, flags;
|
||||||
git_repository *src;
|
git_repository *src;
|
||||||
git_buf src_odb = GIT_BUF_INIT, dst_odb = GIT_BUF_INIT, src_path = GIT_BUF_INIT;
|
git_buf src_odb = GIT_BUF_INIT, dst_odb = GIT_BUF_INIT, src_path = GIT_BUF_INIT;
|
||||||
git_buf reflog_message = GIT_BUF_INIT;
|
git_buf reflog_message = GIT_BUF_INIT;
|
||||||
const char *url;
|
|
||||||
|
|
||||||
assert(repo && remote);
|
assert(repo && remote);
|
||||||
|
|
||||||
@ -490,19 +489,8 @@ int git_clone_local_into(git_repository *repo, git_remote *remote, const git_che
|
|||||||
* repo, if it's not rooted, the path should be relative to
|
* repo, if it's not rooted, the path should be relative to
|
||||||
* the repository's worktree/gitdir.
|
* the repository's worktree/gitdir.
|
||||||
*/
|
*/
|
||||||
url = git_remote_url(remote);
|
if ((error = git_path_from_url_or_path(&src_path, git_remote_url(remote))) < 0)
|
||||||
if (!git__prefixcmp(url, "file://"))
|
return error;
|
||||||
root = strlen("file://");
|
|
||||||
else
|
|
||||||
root = git_path_root(url);
|
|
||||||
|
|
||||||
if (root >= 0)
|
|
||||||
git_buf_puts(&src_path, url + root);
|
|
||||||
else
|
|
||||||
git_buf_joinpath(&src_path, repository_base(repo), url);
|
|
||||||
|
|
||||||
if (git_buf_oom(&src_path))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* Copy .git/objects/ from the source to the target */
|
/* Copy .git/objects/ from the source to the target */
|
||||||
if ((error = git_repository_open(&src, git_buf_cstr(&src_path))) < 0) {
|
if ((error = git_repository_open(&src, git_buf_cstr(&src_path))) < 0) {
|
||||||
|
18
src/path.c
18
src/path.c
@ -1127,3 +1127,21 @@ int git_path_dirload_with_stat(
|
|||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int git_path_from_url_or_path(git_buf *local_path_out, const char *url_or_path)
|
||||||
|
{
|
||||||
|
int error;
|
||||||
|
|
||||||
|
/* If url_or_path begins with file:// treat it as a URL */
|
||||||
|
if (!git__prefixcmp(url_or_path, "file://")) {
|
||||||
|
if ((error = git_path_fromurl(local_path_out, url_or_path)) < 0) {
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
} else { /* We assume url_or_path is already a path */
|
||||||
|
if ((error = git_buf_sets(local_path_out, url_or_path)) < 0) {
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@ -438,4 +438,7 @@ extern int git_path_iconv(git_path_iconv_t *ic, char **in, size_t *inlen);
|
|||||||
|
|
||||||
extern bool git_path_does_fs_decompose_unicode(const char *root);
|
extern bool git_path_does_fs_decompose_unicode(const char *root);
|
||||||
|
|
||||||
|
/* Used for paths to repositories on the filesystem */
|
||||||
|
extern int git_path_from_url_or_path(git_buf *local_path_out, const char *url_or_path);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -175,24 +175,6 @@ on_error:
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int path_from_url_or_path(git_buf *local_path_out, const char *url_or_path)
|
|
||||||
{
|
|
||||||
int error;
|
|
||||||
|
|
||||||
/* If url_or_path begins with file:// treat it as a URL */
|
|
||||||
if (!git__prefixcmp(url_or_path, "file://")) {
|
|
||||||
if ((error = git_path_fromurl(local_path_out, url_or_path)) < 0) {
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
} else { /* We assume url_or_path is already a path */
|
|
||||||
if ((error = git_buf_sets(local_path_out, url_or_path)) < 0) {
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Try to open the url as a git directory. The direction doesn't
|
* Try to open the url as a git directory. The direction doesn't
|
||||||
* matter in this case because we're calculating the heads ourselves.
|
* matter in this case because we're calculating the heads ourselves.
|
||||||
@ -222,7 +204,7 @@ static int local_connect(
|
|||||||
t->flags = flags;
|
t->flags = flags;
|
||||||
|
|
||||||
/* 'url' may be a url or path; convert to a path */
|
/* 'url' may be a url or path; convert to a path */
|
||||||
if ((error = path_from_url_or_path(&buf, url)) < 0) {
|
if ((error = git_path_from_url_or_path(&buf, url)) < 0) {
|
||||||
git_buf_free(&buf);
|
git_buf_free(&buf);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
@ -386,7 +368,7 @@ static int local_push(
|
|||||||
size_t j;
|
size_t j;
|
||||||
|
|
||||||
/* 'push->remote->url' may be a url or path; convert to a path */
|
/* 'push->remote->url' may be a url or path; convert to a path */
|
||||||
if ((error = path_from_url_or_path(&buf, push->remote->url)) < 0) {
|
if ((error = git_path_from_url_or_path(&buf, push->remote->url)) < 0) {
|
||||||
git_buf_free(&buf);
|
git_buf_free(&buf);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user