18
18
# along with this program; if not, write to the Free Software
19
19
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21
22
"""Git-specific subcommands for Bazaar."""
23
from bzrlib.commands import (
26
from bzrlib.option import (
30
from bzrlib.plugins.git import (
24
from bzrlib.commands import Command
25
from bzrlib.option import Option
34
27
class cmd_git_serve(Command):
35
28
"""Provide access to a Bazaar branch using the git protocol.
59
52
server = TCPGitServer(backend, 'localhost')
60
53
server.serve_forever()
63
55
class cmd_git_import(Command):
64
56
"""Import all branches from a git repository.
68
takes_args = ["src_location", "dest_location?"]
60
takes_args = ["src_location", "dest_location"]
70
def run(self, src_location, dest_location=None):
76
from bzrlib.bzrdir import (
80
from bzrlib.errors import (
62
def run(self, src_location, dest_location):
63
from bzrlib.bzrdir import BzrDir, format_registry
64
from bzrlib.errors import NoRepositoryPresent, NotBranchError
85
65
from bzrlib.repository import Repository
86
from bzrlib.plugins.git.branch import GitBranch
87
from bzrlib.plugins.git.fetch import InterGitNonGitRepository
88
from bzrlib.plugins.git.repository import GitRepository
90
if dest_location is None:
91
dest_location = os.path.basename(src_location.rstrip("/\\"))
93
66
source_repo = Repository.open(src_location)
94
if not isinstance(source_repo, GitRepository):
95
raise BzrCommandError("%r is not a git repository" % src_location)
96
format = get_rich_root_format()
67
format = format_registry.make_bzrdir('rich-root-pack')
98
69
target_bzrdir = BzrDir.open(dest_location)
99
70
except NotBranchError:
103
74
except NoRepositoryPresent:
104
75
target_repo = target_bzrdir.create_repository(shared=True)
106
interrepo = InterGitNonGitRepository(source_repo, target_repo)
107
mapping = source_repo.get_mapping()
108
refs = interrepo.fetch_refs()
109
pb = ui.ui_factory.nested_progress_bar()
111
for i, (name, ref) in enumerate(refs.iteritems()):
112
if name.startswith("refs/tags/"):
114
pb.update("creating branches", i, len(refs))
115
head_loc = os.path.join(dest_location, name)
117
head_bzrdir = BzrDir.open(head_loc)
118
except NotBranchError:
119
parent_path = urlutils.dirname(head_loc)
120
if not os.path.isdir(parent_path):
121
os.makedirs(parent_path)
122
head_bzrdir = BzrDir.create(head_loc, format=format)
124
head_branch = head_bzrdir.open_branch()
125
except NotBranchError:
126
head_branch = head_bzrdir.create_branch()
127
revid = mapping.revision_id_foreign_to_bzr(ref)
128
source_branch = GitBranch(source_repo.bzrdir, source_repo,
130
head_branch.generate_revision_history(revid)
131
source_branch.tags.merge_to(head_branch.tags)
77
target_repo.fetch(source_repo)
78
for name, ref in source_repo._git.heads().iteritems():
79
head_loc = os.path.join(dest_location, name)
81
head_bzrdir = BzrDir.open(head_loc)
82
except NotBranchError:
83
head_bzrdir = BzrDir.create(head_loc, format=format)
85
head_branch = head_bzrdir.open_branch()
86
except NotBranchError:
87
head_branch = head_bzrdir.create_branch()
88
head_branch.generate_revision_history(source_repo.get_mapping().revision_id_foreign_to_bzr(ref))