clone: wrap clone_into()
This allows the user to prepare the repository and remote with whichever custom settings they want before performing the "clone" proper.
This commit is contained in:
@@ -129,4 +129,27 @@ def clone_repository(
|
|||||||
|
|
||||||
return Repository(path)
|
return Repository(path)
|
||||||
|
|
||||||
|
def clone_into(repo, remote, branch=None):
|
||||||
|
"""Clone into an empty repository from the specified remote
|
||||||
|
|
||||||
|
:param Repository repo: The empty repository into which to clone
|
||||||
|
|
||||||
|
:param Remote remote: The remote from which to clone
|
||||||
|
|
||||||
|
:param str branch: Branch to checkout after the clone. Pass None
|
||||||
|
to use the remotes's default branch.
|
||||||
|
|
||||||
|
This allows you specify arbitrary repository and remote configurations
|
||||||
|
before performing the clone step itself. E.g. you can replicate git-clone's
|
||||||
|
'--mirror' option by setting a refspec of '+refs/*:refs/*', 'core.mirror' to true
|
||||||
|
and calling this function.
|
||||||
|
"""
|
||||||
|
|
||||||
|
err = C.git_clone_into(repo._repo, remote._remote, ffi.NULL, to_str(branch))
|
||||||
|
|
||||||
|
if remote._stored_exception:
|
||||||
|
raise remote._stored_exception
|
||||||
|
|
||||||
|
check_error(err)
|
||||||
|
|
||||||
settings = Settings()
|
settings = Settings()
|
||||||
|
@@ -216,6 +216,7 @@ int git_clone(git_repository **out,
|
|||||||
const char *local_path,
|
const char *local_path,
|
||||||
const git_clone_options *options);
|
const git_clone_options *options);
|
||||||
|
|
||||||
|
int git_clone_into(git_repository *repo, git_remote *remote, const git_checkout_opts *co_opts, const char *branch);
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
GIT_CONFIG_LEVEL_SYSTEM = 1,
|
GIT_CONFIG_LEVEL_SYSTEM = 1,
|
||||||
|
@@ -40,7 +40,7 @@ from os.path import join, realpath
|
|||||||
|
|
||||||
# Import from pygit2
|
# Import from pygit2
|
||||||
from pygit2 import GIT_OBJ_ANY, GIT_OBJ_BLOB, GIT_OBJ_COMMIT
|
from pygit2 import GIT_OBJ_ANY, GIT_OBJ_BLOB, GIT_OBJ_COMMIT
|
||||||
from pygit2 import init_repository, clone_repository, discover_repository
|
from pygit2 import init_repository, clone_repository, clone_into, discover_repository
|
||||||
from pygit2 import Oid, Reference, hashfile
|
from pygit2 import Oid, Reference, hashfile
|
||||||
import pygit2
|
import pygit2
|
||||||
from . import utils
|
from . import utils
|
||||||
@@ -461,6 +461,13 @@ class CloneRepositoryTest(utils.NoRepoTestCase):
|
|||||||
self.assertFalse(repo.is_empty)
|
self.assertFalse(repo.is_empty)
|
||||||
self.assertEqual(repo.remotes[0].name, "custom_remote")
|
self.assertEqual(repo.remotes[0].name, "custom_remote")
|
||||||
|
|
||||||
|
def test_clone_into(self):
|
||||||
|
repo_path = "./test/data/testrepo.git/"
|
||||||
|
repo = init_repository(os.path.join(self._temp_dir, "clone-into"))
|
||||||
|
remote = repo.create_remote("origin", 'file://' + os.path.realpath(repo_path))
|
||||||
|
clone_into(repo, remote)
|
||||||
|
self.assertTrue('refs/remotes/origin/master' in repo.listall_references())
|
||||||
|
|
||||||
def test_clone_with_credentials(self):
|
def test_clone_with_credentials(self):
|
||||||
credentials = pygit2.UserPass("libgit2", "libgit2")
|
credentials = pygit2.UserPass("libgit2", "libgit2")
|
||||||
repo = clone_repository(
|
repo = clone_repository(
|
||||||
|
Reference in New Issue
Block a user