/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
1
#!/usr/bin/env python
2
# vim: expandtab
3
0.358.2 by Jelmer Vernooij
Refresh copyright headers, add my email.
4
# Copyright (C) 2011-2018 Jelmer Vernooij <jelmer@jelmer.uk>
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
5
6
# This program is free software; you can redistribute it and/or modify
7
# it under the terms of the GNU General Public License as published by
8
# the Free Software Foundation; either version 2 of the License, or
9
# (at your option) any later version.
10
#
11
# This program is distributed in the hope that it will be useful,
12
# but WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
# GNU General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License
17
# along with this program; if not, write to the Free Software
0.358.1 by Jelmer Vernooij
Fix FSF address.
18
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
19
20
21
"""Remote helper for git for accessing bzr repositories."""
22
0.200.1594 by Jelmer Vernooij
Use absolute_import everywhere.
23
from __future__ import absolute_import
24
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
25
CAPABILITIES = ["fetch", "option", "push"]
26
27
import os
28
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
29
from ...controldir import ControlDir
30
from ...errors import NotBranchError, NoRepositoryPresent
31
from ...repository import InterRepository
32
from ...transport import get_transport_from_path
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
33
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
34
from . import (
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
35
    LocalGitProber,
36
    )
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
37
from .dir import (
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
38
    BareLocalGitControlDirFormat,
39
    LocalGitControlDirFormat,
40
    )
41
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
42
from .object_store import (
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
43
    get_object_store,
44
    )
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
45
from .refs import (
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
46
    get_refs_container,
47
    ref_to_branch_name,
48
    )
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
49
from .repository import (
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
50
    GitRepository,
51
    )
52
0.337.1 by Jelmer Vernooij
Various git remote helper fixes.
53
from ..fastimport import exporter as fastexporter
54
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
55
try:
0.337.1 by Jelmer Vernooij
Various git remote helper fixes.
56
    import fastimport
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
57
except ImportError:
0.337.1 by Jelmer Vernooij
Various git remote helper fixes.
58
    pass
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
59
else:
60
    CAPABILITIES.append("import")
61
62
def open_remote_dir(url):
63
    try:
64
        return ControlDir.open(url)
65
    except NotBranchError:
66
        return ControlDir.create(url)
67
68
69
def fetch(outf, wants, shortname, remote_dir, local_dir):
70
    remote_repo = remote_dir.find_repository()
71
    local_repo = local_dir.find_repository()
72
    inter = InterRepository.get(remote_repo, local_repo)
0.200.1586 by Jelmer Vernooij
Fixes duplicate tag warnings in 'git-remote-bzr' helper.
73
    revs = []
74
    for (sha1, ref) in wants:
75
        revs.append((sha1, None))
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
76
    if (isinstance(remote_repo, GitRepository) and
77
        isinstance(local_repo, GitRepository)):
78
        lossy = False
79
    else:
80
        lossy = True
0.200.1586 by Jelmer Vernooij
Fixes duplicate tag warnings in 'git-remote-bzr' helper.
81
    inter.fetch_objects(revs, lossy=lossy)
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
82
    outf.write("\n")
83
84
85
def push(outf, wants, shortname, remote_dir, local_dir):
86
    for (src_ref, dest_ref) in wants:
87
        local_branch = local_dir.open_branch(ref=src_ref)
88
        dest_branch_name = ref_to_branch_name(dest_ref)
89
        if dest_branch_name == "master":
90
            dest_branch_name = None
91
        try:
92
            remote_branch = remote_dir.open_branch(name=dest_branch_name)
93
        except NotBranchError:
94
            remote_branch = remote_dir.create_branch(name=dest_branch_name)
95
        local_branch.push(remote_branch)
96
        outf.write("ok %s\n" % dest_ref)
97
    outf.write("\n")
98
99
100
class RemoteHelper(object):
101
    """Git remote helper."""
102
103
    def __init__(self, local_dir, shortname, remote_dir):
104
        self.local_dir = local_dir
105
        self.shortname = shortname
106
        self.remote_dir = remote_dir
107
        self.batchcmd = None
108
        self.wants = []
109
110
    def cmd_capabilities(self, outf, argv):
111
        outf.write("\n".join(CAPABILITIES)+"\n\n")
112
113
    def cmd_list(self, outf, argv):
114
        try:
115
            repo = self.remote_dir.find_repository()
116
        except NoRepositoryPresent:
117
            repo = self.remote_dir.create_repository()
118
        object_store = get_object_store(repo)
0.200.1788 by Jelmer Vernooij
Use context managers.
119
        with object_store.lock_read():
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
120
            refs = get_refs_container(self.remote_dir, object_store)
121
            for ref, git_sha1 in refs.as_dict().iteritems():
0.200.1610 by Jelmer Vernooij
Convert ~ to _ in tag names.
122
                ref = ref.replace("~", "_")
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
123
                outf.write("%s %s\n" % (git_sha1, ref))
124
            outf.write("\n")
125
126
    def cmd_option(self, outf, argv):
127
        outf.write("unsupported\n")
128
129
    def cmd_fetch(self, outf, argv):
130
        if self.batchcmd not in (None, "fetch"):
131
            raise Exception("fetch command inside other batch command")
132
        self.wants.append(tuple(argv[1:]))
133
        self.batchcmd = "fetch"
134
135
    def cmd_push(self, outf, argv):
136
        if self.batchcmd not in (None, "push"):
137
            raise Exception("push command inside other batch command")
138
        self.wants.append(tuple(argv[1].split(":", 1)))
139
        self.batchcmd = "push"
140
141
    def cmd_import(self, outf, argv):
0.337.1 by Jelmer Vernooij
Various git remote helper fixes.
142
        if "fastimport" in CAPABILITIES:
143
            raise Exception("install fastimport for 'import' command support")
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
144
        dest_branch_name = ref_to_branch_name(argv[1])
145
        if dest_branch_name == "master":
146
            dest_branch_name = None
147
        remote_branch = self.remote_dir.open_branch(name=dest_branch_name)
148
        exporter = fastexporter.BzrFastExporter(remote_branch,
0.200.1581 by Jelmer Vernooij
Fix support for newer versions of bzr-fastimport, add more tests.
149
            outf=outf, ref=argv[1],
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
150
            checkpoint=None, import_marks_file=None,
151
            export_marks_file=None, revision=None,
152
            verbose=None, plain_format=True,
153
            rewrite_tags=False)
154
        exporter.run()
155
156
    commands = {
157
        "capabilities": cmd_capabilities,
158
        "list": cmd_list,
159
        "option": cmd_option,
160
        "fetch": cmd_fetch,
161
        "push": cmd_push,
162
        "import": cmd_import,
163
        }
164
165
    def process(self, inf, outf):
166
        while True:
167
            l = inf.readline()
168
            if not l:
169
                break
170
            self.process_line(l, outf)
171
172
    def process_line(self, l, outf):
173
        argv = l.strip().split()
174
        if argv == []:
175
            if self.batchcmd == "fetch":
176
                fetch(outf, self.wants, self.shortname, self.remote_dir, self.local_dir)
177
            elif self.batchcmd == "push":
178
                push(outf, self.wants, self.shortname, self.remote_dir, self.local_dir)
179
            elif self.batchcmd is None:
180
                return
181
            else:
182
                raise AssertionError("invalid batch %r" % self.batchcmd)
183
            self.batchcmd = None
184
        else:
185
            try:
186
               self.commands[argv[0]](self, outf, argv)
187
            except KeyError:
188
               raise Exception("Unknown remote command %r" % argv)
189
        outf.flush()
190
191
192
def open_local_dir():
193
    try:
194
        git_path = os.environ["GIT_DIR"]
195
    except KeyError:
196
        git_transport = get_transport_from_path(".")
197
        git_format = LocalGitProber().probe_transport(git_transport)
198
    else:
199
        if git_path.endswith("/.git"):
200
            git_format = LocalGitControlDirFormat()
201
            git_path = git_path[:-4]
202
        else:
203
            git_format = BareLocalGitControlDirFormat()
204
        git_transport = get_transport_from_path(git_path)
205
206
    return git_format.open(git_transport)