Commit 121b2673 by Carlos Martín Nieto

clone: add flags to override whether to perform a local clone

parent a0b5f785
...@@ -23,6 +23,12 @@ ...@@ -23,6 +23,12 @@
*/ */
GIT_BEGIN_DECL GIT_BEGIN_DECL
typedef enum {
GIT_CLONE_LOCAL_AUTO,
GIT_CLONE_LOCAL,
GIT_CLONE_NO_LOCAL,
} git_clone_local_t;
/** /**
* Clone options structure * Clone options structure
* *
...@@ -57,6 +63,7 @@ typedef struct git_clone_options { ...@@ -57,6 +63,7 @@ typedef struct git_clone_options {
int bare; int bare;
int ignore_cert_errors; int ignore_cert_errors;
git_clone_local_t local;
const char *remote_name; const char *remote_name;
const char* checkout_branch; const char* checkout_branch;
git_signature *signature; git_signature *signature;
......
...@@ -347,6 +347,29 @@ cleanup: ...@@ -347,6 +347,29 @@ cleanup:
return error; return error;
} }
int git_clone__should_clone_local(const char *url, git_clone_local_t local)
{
const char *path;
int is_url;
if (local == GIT_CLONE_NO_LOCAL)
return false;
is_url = !git__prefixcmp(url, "file://");
if (is_url && local != GIT_CLONE_LOCAL)
return false;
path = url;
if (is_url)
path = url + strlen("file://");
if ((git_path_exists(path) && git_path_isdir(path)) && local != GIT_CLONE_NO_LOCAL)
return true;
return false;
}
int git_clone( int git_clone(
git_repository **out, git_repository **out,
const char *url, const char *url,
...@@ -381,7 +404,7 @@ int git_clone( ...@@ -381,7 +404,7 @@ int git_clone(
return error; return error;
if (!(error = create_and_configure_origin(&origin, repo, url, &options))) { if (!(error = create_and_configure_origin(&origin, repo, url, &options))) {
if (git_path_exists(url) && git_path_isdir(url)) { if (git_clone__should_clone_local(url, options.local)) {
error = git_clone_local_into( error = git_clone_local_into(
repo, origin, &options.checkout_opts, repo, origin, &options.checkout_opts,
options.checkout_branch, options.signature); options.checkout_branch, options.signature);
......
/*
* Copyright (C) the libgit2 contributors. All rights reserved.
*
* This file is part of libgit2, distributed under the GNU GPL v2 with
* a Linking Exception. For full terms see the included COPYING file.
*/
#ifndef INCLUDE_clone_h__
#define INCLUDE_clone_h__
extern int git_clone__should_clone_local(const char *url, git_clone_local_t local);
#endif
#include "clar_libgit2.h"
#include "git2/clone.h"
#include "clone.h"
#include "buffer.h"
void assert_clone(const char *path, git_clone_local_t opt, int val)
{
cl_assert_equal_i(val, git_clone__should_clone_local(path, opt));
}
void test_clone_local__should_clone_local(void)
{
git_buf buf = GIT_BUF_INIT;
const char *path;
/* we use a fixture path because it needs to exist for us to want to clone */
cl_git_pass(git_buf_printf(&buf, "file://%s", cl_fixture("testrepo.git")));
cl_assert_equal_i(false, git_clone__should_clone_local(buf.ptr, GIT_CLONE_LOCAL_AUTO));
cl_assert_equal_i(true, git_clone__should_clone_local(buf.ptr, GIT_CLONE_LOCAL));
cl_assert_equal_i(false, git_clone__should_clone_local(buf.ptr, GIT_CLONE_NO_LOCAL));
git_buf_free(&buf);
path = cl_fixture("testrepo.git");
cl_assert_equal_i(true, git_clone__should_clone_local(path, GIT_CLONE_LOCAL_AUTO));
cl_assert_equal_i(true, git_clone__should_clone_local(path, GIT_CLONE_LOCAL));
cl_assert_equal_i(false, git_clone__should_clone_local(path, GIT_CLONE_NO_LOCAL));
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment