checkout: add support for overriding the target directory

This commit is contained in:
Carlos Martín Nieto
2014-07-11 14:03:17 +02:00
parent af38211d0c
commit 763b571c84
2 changed files with 26 additions and 7 deletions

View File

@@ -185,21 +185,30 @@ class Repository(_Repository):
copts = ffi.new('git_checkout_options *')
check_error(C.git_checkout_init_options(copts, 1))
# References we need to keep to strings and so forth
refs = []
# pygit2's default is SAFE_CREATE
copts.checkout_strategy = GIT_CHECKOUT_SAFE_CREATE
# and go through the arguments to see what the user wanted
for k, v in kwargs.iteritems():
if k == 'strategy':
copts.checkout_strategy = v
strategy = kwargs.get('strategy')
if strategy:
copts.checkout_strategy = strategy
return copts
directory = kwargs.get('directory')
if directory:
target_dir = ffi.new('char[]', to_str(directory))
refs.append(target_dir)
copts.target_directory = target_dir
return copts, refs
def checkout_head(self, **kwargs):
"""Checkout HEAD
For arguments, see Repository.checkout().
"""
copts = Repository._checkout_args_to_options(**kwargs)
copts, refs = Repository._checkout_args_to_options(**kwargs)
check_error(C.git_checkout_head(self._repo, copts))
def checkout_index(self, **kwargs):
@@ -207,7 +216,7 @@ class Repository(_Repository):
For arguments, see Repository.checkout().
"""
copts = Repository._checkout_args_to_options(**kwargs)
copts, refs = Repository._checkout_args_to_options(**kwargs)
check_error(C.git_checkout_index(self._repo, ffi.NULL, copts))
def checkout_tree(self, treeish, **kwargs):
@@ -215,7 +224,7 @@ class Repository(_Repository):
For arguments, see Repository.checkout().
"""
copts = Repository._checkout_args_to_options(**kwargs)
copts, refs = Repository._checkout_args_to_options(**kwargs)
cptr = ffi.new('git_object **')
ffi.buffer(cptr)[:] = treeish._pointer[:]
@@ -242,6 +251,8 @@ class Repository(_Repository):
:param int strategy: A ``GIT_CHECKOUT_`` value. The default is
``GIT_CHECKOUT_SAFE_CREATE``.
:param str directory: Alternative checkout path to workdir.
"""

View File

@@ -246,6 +246,14 @@ class RepositoryTest_II(utils.RepoTestCase):
self.repo.checkout('HEAD', strategy=pygit2.GIT_CHECKOUT_FORCE)
self.assertTrue('bye.txt' not in self.repo.status())
def test_checkout_alternative_dir(self):
ref_i18n = self.repo.lookup_reference('refs/heads/i18n')
extra_dir = os.path.join(self.repo.workdir, 'extra-dir')
os.mkdir(extra_dir)
self.assertTrue(len(os.listdir(extra_dir)) == 0)
self.repo.checkout(ref_i18n, directory=extra_dir)
self.assertFalse(len(os.listdir(extra_dir)) == 0)
def test_merge_base(self):
commit = self.repo.merge_base(
'5ebeeebb320790caf276b9fc8b24546d63316533',