77import os
88from git import Repo
99from unittest import TestCase
10+ import tempfile
11+ import shutil
1012
1113GIT_REPO = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
1214
@@ -75,35 +77,41 @@ def case(self, rw_repo)
7577 heads, generally operations that do not need a working tree.
7678 """
7779 def bare_repo_creator(self):
78- rw_repo = None
80+ repo_dir = tempfile.mktemp("bare_repo")
81+ rw_repo = self.rorepo.clone(repo_dir, shared=True, bare=True)
7982 try:
8083 return func(self, rw_repo)
8184 finally:
82- pass
85+ shutil.rmtree(repo_dir)
8386 # END cleanup
8487 # END bare repo creator
8588 bare_repo_creator.__name__ = func.__name__
8689 return bare_repo_creator
8790
88- def with_rw_repo(func, working_tree_ref='0.1.6'):
91+ def with_rw_repo(working_tree_ref='0.1.6'):
8992 """
9093 Same as with_bare_repo, but clones the rorepo as non-bare repository, checking
9194 out the working tree at the given working_tree_ref.
9295
9396 This repository type is more costly due to the working copy checkout.
9497 """
95- def repo_creator(self):
96- rw_repo = None
97- try:
98- return func(self, rw_repo)
99- finally:
100- pass
101- # END cleanup
102- # END bare repo creator
103- repo_creator.__name__ = func.__name__
104- return repo_creator
105-
106- def with_rw_and_rw_remote_repo(func):
98+ def argument_passer(func):
99+ def repo_creator(self):
100+ repo_dir = tempfile.mktemp("non_bare_repo")
101+ rw_repo = self.rorepo.clone(repo_dir, shared=True, bare=False, n=True)
102+ rw_repo.git.checkout(working_tree_ref)
103+ try:
104+ return func(self, rw_repo)
105+ finally:
106+ shutil.rmtree(repo_dir)
107+ # END cleanup
108+ # END rw repo creator
109+ repo_creator.__name__ = func.__name__
110+ return repo_creator
111+ # END argument passer
112+ return argument_passer
113+
114+ def with_rw_and_rw_remote_repo(working_tree_ref='0.1.6'):
107115 """
108116 Same as with_rw_repo, but also provides a writable remote repository from which the
109117 rw_repo has been forked. The remote repository was cloned as bare repository from
@@ -117,17 +125,27 @@ def case(self, rw_repo, rw_remote_repo)
117125
118126 This setup allows you to test push and pull scenarios and hooks nicely.
119127 """
120- def remote_repo_creator(self):
121- rw_repo = None
122- rw_remote_repo = None
123- try:
124- return func(self, rw_repo, rw_remote_repo)
125- finally:
126- pass
127- # END cleanup
128- # END bare repo creator
129- remote_repo_creator.__name__ = func.__name__
130- return remote_repo_creator
128+ def argument_passer(func):
129+ def remote_repo_creator(self):
130+ remote_repo_dir = tempfile.mktemp("remote_repo")
131+ repo_dir = tempfile.mktemp("remote_clone_non_bare_repo")
132+
133+ rw_remote_repo = self.rorepo.clone(remote_repo_dir, shared=True, bare=True)
134+ rw_repo = rw_remote_repo.clone(repo_dir, shared=True, bare=False, n=True) # recursive alternates info ?
135+ rw_repo.git.checkout(working_tree_ref)
136+ try:
137+ return func(self, rw_repo, rw_remote_repo)
138+ finally:
139+ shutil.rmtree(repo_dir)
140+ shutil.rmtree(remote_repo_dir)
141+ # END cleanup
142+ # END bare repo creator
143+ remote_repo_creator.__name__ = func.__name__
144+ return remote_repo_creator
145+ # END remote repo creator
146+ # END argument parsser
147+
148+ return argument_passer
131149
132150
133151class TestBase(TestCase):
0 commit comments