120
108
def _branch_name_to_ref(self, name):
121
109
raise NotImplementedError(self._branch_name_to_ref)
111
if bzrlib_version >= (2, 2):
112
def open_branch(self, name=None, unsupported=False,
113
ignore_fallbacks=None):
114
return self._open_branch(name=name,
115
ignore_fallbacks=ignore_fallbacks, unsupported=unsupported)
117
def open_branch(self, ignore_fallbacks=None, unsupported=False):
118
return self._open_branch(name=None,
119
ignore_fallbacks=ignore_fallbacks, unsupported=unsupported)
123
121
def get_config(self):
124
122
return GitDirConfig()
126
def sprout(self, url, revision_id=None, force_new_repo=False,
127
recurse='down', possible_transports=None,
128
accelerator_tree=None, hardlink=False, stacked=False,
129
source_branch=None, create_tree_if_local=True):
130
from bzrlib.repository import InterRepository
131
from bzrlib.transport.local import LocalTransport
132
from bzrlib.transport import get_transport
133
target_transport = get_transport(url, possible_transports)
134
target_transport.ensure_base()
135
cloning_format = self.cloning_metadir()
136
# Create/update the result branch
137
result = cloning_format.initialize_on_transport(target_transport)
138
source_branch = self.open_branch()
139
source_repository = self.find_repository()
141
result_repo = result.find_repository()
142
except bzr_errors.NoRepositoryPresent:
143
result_repo = result.create_repository()
144
target_is_empty = True
146
target_is_empty = None # Unknown
148
raise bzr_errors.IncompatibleRepositories(source_repository, result_repo)
149
interrepo = InterRepository.get(source_repository, result_repo)
151
if revision_id is not None:
152
determine_wants = interrepo.get_determine_wants_revids(
153
[revision_id], include_tags=True)
155
determine_wants = interrepo.determine_wants_all
156
interrepo.fetch_objects(determine_wants=determine_wants,
157
mapping=source_branch.mapping)
158
result_branch = source_branch.sprout(result,
159
revision_id=revision_id, repository=result_repo)
160
if (create_tree_if_local and isinstance(target_transport, LocalTransport)
161
and (result_repo is None or result_repo.make_working_trees())):
162
wt = result.create_workingtree(accelerator_tree=accelerator_tree,
163
hardlink=hardlink, from_branch=result_branch)
166
if wt.path2id('') is None:
168
wt.set_root_id(self.open_workingtree.get_root_id())
169
except bzr_errors.NoWorkingTree:
175
def clone_on_transport(self, transport, revision_id=None,
176
force_new_repo=False, preserve_stacking=False, stacked_on=None,
177
create_prefix=False, use_existing_dir=True, no_tree=False):
178
"""See ControlDir.clone_on_transport."""
180
format = BareLocalGitControlDirFormat()
182
format = LocalGitControlDirFormat()
183
(target_repo, target_controldir, stacking, repo_policy) = format.initialize_on_transport_ex(transport, use_existing_dir=use_existing_dir, create_prefix=create_prefix, force_new_repo=force_new_repo)
184
target_git_repo = target_repo._git
185
source_repo = self.open_repository()
186
source_git_repo = source_repo._git
187
if revision_id is not None:
188
determine_wants = self.get_determine_wants_revids([revision_id], include_tags=True)
190
determine_wants = self.determine_wants_all
191
refs = source_git_repo.fetch(target_git_repo, determine_wants)
192
for name, val in refs.iteritems():
193
target_git_repo.refs[name] = val
194
lockfiles = GitLockableFiles(transport, GitLock())
195
return self.__class__(transport, lockfiles, target_git_repo, format)
197
def find_repository(self):
198
"""Find the repository that should be used.
200
This does not require a branch as we use it to find the repo for
201
new branches as well as to hook existing branches up to their
204
return self.open_repository()
207
class LocalGitControlDirFormat(GitControlDirFormat):
208
"""The .git directory control format."""
213
def _known_formats(self):
214
return set([LocalGitControlDirFormat()])
217
def repository_format(self):
218
from bzrlib.plugins.git.repository import GitRepositoryFormat
219
return GitRepositoryFormat()
221
def get_branch_format(self):
222
from bzrlib.plugins.git.branch import GitBranchFormat
223
return GitBranchFormat()
225
def open(self, transport, _found=None):
226
"""Open this directory.
229
from bzrlib.plugins.git.transportgit import TransportRepo
230
gitrepo = TransportRepo(transport)
231
lockfiles = GitLockableFiles(transport, GitLock())
232
return LocalGitDir(transport, lockfiles, gitrepo, self)
234
def get_format_description(self):
235
return "Local Git Repository"
237
def initialize_on_transport(self, transport):
238
from bzrlib.plugins.git.transportgit import TransportRepo
239
TransportRepo.init(transport, bare=self.bare)
240
return self.open(transport)
242
def initialize_on_transport_ex(self, transport, use_existing_dir=False,
243
create_prefix=False, force_new_repo=False, stacked_on=None,
244
stack_on_pwd=None, repo_format_name=None, make_working_trees=None,
245
shared_repo=False, vfs_only=False):
246
def make_directory(transport):
249
def redirected(transport, e, redirection_notice):
250
trace.note(redirection_notice)
251
return transport._redirected_to(e.source, e.target)
253
transport = do_catching_redirections(make_directory, transport,
255
except bzr_errors.FileExists:
256
if not use_existing_dir:
258
except bzr_errors.NoSuchFile:
259
if not create_prefix:
261
transport.create_prefix()
262
controldir = self.initialize_on_transport(transport)
263
repository = controldir.open_repository()
264
repository.lock_write()
265
return (repository, controldir, False, CreateRepository(controldir))
267
def is_supported(self):
271
class BareLocalGitControlDirFormat(LocalGitControlDirFormat):
274
supports_workingtrees = False
276
def get_format_description(self):
277
return "Local Git Repository (bare)"
280
125
class LocalGitDir(GitDir):
281
126
"""An adapter to the '.git' dir used by git."""