]> git.proxmox.com Git - libgit2.git/commitdiff
clone: add flags to override whether to perform a local clone
authorCarlos Martín Nieto <cmn@dwim.me>
Mon, 23 Dec 2013 11:12:31 +0000 (11:12 +0000)
committerCarlos Martín Nieto <cmn@dwim.me>
Wed, 28 May 2014 13:40:22 +0000 (15:40 +0200)
include/git2/clone.h
src/clone.c
src/clone.h [new file with mode: 0644]
tests/clone/local.c [new file with mode: 0644]

index ceb1a53bb47f7b7695b7b0e97b3e5307ef1d1fc8..71e8e72f2443742ff0f96c68b6963b52df39c052 100644 (file)
  */
 GIT_BEGIN_DECL
 
+typedef enum {
+       GIT_CLONE_LOCAL_AUTO,
+       GIT_CLONE_LOCAL,
+       GIT_CLONE_NO_LOCAL,
+} git_clone_local_t;
+
 /**
  * Clone options structure
  *
@@ -57,6 +63,7 @@ typedef struct git_clone_options {
 
        int bare;
        int ignore_cert_errors;
+       git_clone_local_t local;
        const char *remote_name;
        const char* checkout_branch;
        git_signature *signature;
index b6f8c7e85184513557af3512ab39b94aee89a3a4..58430f63ad6e45c17d5eb6e1b0720e368db5bc0c 100644 (file)
@@ -347,6 +347,29 @@ cleanup:
        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(
        git_repository **out,
        const char *url,
@@ -381,7 +404,7 @@ int git_clone(
                return error;
 
        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(
                                repo, origin, &options.checkout_opts,
                                options.checkout_branch, options.signature);
diff --git a/src/clone.h b/src/clone.h
new file mode 100644 (file)
index 0000000..14ca5d4
--- /dev/null
@@ -0,0 +1,12 @@
+/*
+ * 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
diff --git a/tests/clone/local.c b/tests/clone/local.c
new file mode 100644 (file)
index 0000000..478bbb6
--- /dev/null
@@ -0,0 +1,29 @@
+#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));
+}