/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
6986.2.1 by Jelmer Vernooij
Move breezy.plugins.git to breezy.git.
29
from ..controldir import ControlDir
30
from ..errors import NotBranchError, NoRepositoryPresent
31
from ..repository import InterRepository
6986.2.3 by Jelmer Vernooij
Merge trunk
32
from ..sixish import viewitems
6986.2.1 by Jelmer Vernooij
Move breezy.plugins.git to breezy.git.
33
from ..transport import get_transport_from_path
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
34
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
35
from . import (
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
36
    LocalGitProber,
37
    )
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
38
from .dir import (
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
39
    BareLocalGitControlDirFormat,
40
    LocalGitControlDirFormat,
41
    )
42
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
43
from .object_store import (
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
44
    get_object_store,
45
    )
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
46
from .refs import (
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
47
    get_refs_container,
48
    ref_to_branch_name,
49
    )
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
50
from .repository import (
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
51
    GitRepository,
52
    )
53
6986.2.1 by Jelmer Vernooij
Move breezy.plugins.git to breezy.git.
54
from ..plugins.fastimport import exporter as fastexporter
0.337.1 by Jelmer Vernooij
Various git remote helper fixes.
55
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
56
try:
0.337.1 by Jelmer Vernooij
Various git remote helper fixes.
57
    import fastimport
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
58
except ImportError:
0.337.1 by Jelmer Vernooij
Various git remote helper fixes.
59
    pass
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
60
else:
61
    CAPABILITIES.append("import")
62
63
def open_remote_dir(url):
64
    try:
65
        return ControlDir.open(url)
66
    except NotBranchError:
67
        return ControlDir.create(url)
68
69
70
def fetch(outf, wants, shortname, remote_dir, local_dir):
71
    remote_repo = remote_dir.find_repository()
72
    local_repo = local_dir.find_repository()
73
    inter = InterRepository.get(remote_repo, local_repo)
0.200.1586 by Jelmer Vernooij
Fixes duplicate tag warnings in 'git-remote-bzr' helper.
74
    revs = []
75
    for (sha1, ref) in wants:
76
        revs.append((sha1, None))
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
77
    if (isinstance(remote_repo, GitRepository) and
78
        isinstance(local_repo, GitRepository)):
79
        lossy = False
80
    else:
81
        lossy = True
0.200.1586 by Jelmer Vernooij
Fixes duplicate tag warnings in 'git-remote-bzr' helper.
82
    inter.fetch_objects(revs, lossy=lossy)
6973.5.10 by Jelmer Vernooij
Random bunch of python3 bee-improvements.
83
    outf.write(b"\n")
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
84
85
86
def push(outf, wants, shortname, remote_dir, local_dir):
87
    for (src_ref, dest_ref) in wants:
88
        local_branch = local_dir.open_branch(ref=src_ref)
89
        dest_branch_name = ref_to_branch_name(dest_ref)
90
        if dest_branch_name == "master":
91
            dest_branch_name = None
92
        try:
93
            remote_branch = remote_dir.open_branch(name=dest_branch_name)
94
        except NotBranchError:
95
            remote_branch = remote_dir.create_branch(name=dest_branch_name)
96
        local_branch.push(remote_branch)
6973.5.10 by Jelmer Vernooij
Random bunch of python3 bee-improvements.
97
        outf.write(b"ok %s\n" % dest_ref)
98
    outf.write(b"\n")
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
99
100
101
class RemoteHelper(object):
102
    """Git remote helper."""
103
104
    def __init__(self, local_dir, shortname, remote_dir):
105
        self.local_dir = local_dir
106
        self.shortname = shortname
107
        self.remote_dir = remote_dir
108
        self.batchcmd = None
109
        self.wants = []
110
111
    def cmd_capabilities(self, outf, argv):
6973.5.10 by Jelmer Vernooij
Random bunch of python3 bee-improvements.
112
        outf.write(b"\n".join([c.encode() for c in CAPABILITIES])+b"\n\n")
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
113
114
    def cmd_list(self, outf, argv):
115
        try:
116
            repo = self.remote_dir.find_repository()
117
        except NoRepositoryPresent:
118
            repo = self.remote_dir.create_repository()
119
        object_store = get_object_store(repo)
0.200.1788 by Jelmer Vernooij
Use context managers.
120
        with object_store.lock_read():
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
121
            refs = get_refs_container(self.remote_dir, object_store)
7018.3.8 by Jelmer Vernooij
Disable some flaky tests on python3, allow running without fastimport.
122
            for ref, git_sha1 in viewitems(refs.as_dict()):
123
                ref = ref.replace(b"~", b"_")
6973.5.10 by Jelmer Vernooij
Random bunch of python3 bee-improvements.
124
                outf.write(b"%s %s\n" % (git_sha1, ref))
125
            outf.write(b"\n")
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
126
127
    def cmd_option(self, outf, argv):
6973.5.10 by Jelmer Vernooij
Random bunch of python3 bee-improvements.
128
        outf.write(b"unsupported\n")
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
129
130
    def cmd_fetch(self, outf, argv):
131
        if self.batchcmd not in (None, "fetch"):
132
            raise Exception("fetch command inside other batch command")
133
        self.wants.append(tuple(argv[1:]))
134
        self.batchcmd = "fetch"
135
136
    def cmd_push(self, outf, argv):
137
        if self.batchcmd not in (None, "push"):
138
            raise Exception("push command inside other batch command")
139
        self.wants.append(tuple(argv[1].split(":", 1)))
140
        self.batchcmd = "push"
141
142
    def cmd_import(self, outf, argv):
0.337.1 by Jelmer Vernooij
Various git remote helper fixes.
143
        if "fastimport" in CAPABILITIES:
144
            raise Exception("install fastimport for 'import' command support")
7045.4.8 by Jelmer Vernooij
Fix another 128 tests on python 3.
145
        ref = argv[1].encode('utf-8')
146
        dest_branch_name = ref_to_branch_name(ref)
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
147
        if dest_branch_name == "master":
148
            dest_branch_name = None
149
        remote_branch = self.remote_dir.open_branch(name=dest_branch_name)
150
        exporter = fastexporter.BzrFastExporter(remote_branch,
7045.4.8 by Jelmer Vernooij
Fix another 128 tests on python 3.
151
            outf=outf, ref=ref,
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
152
            checkpoint=None, import_marks_file=None,
153
            export_marks_file=None, revision=None,
154
            verbose=None, plain_format=True,
155
            rewrite_tags=False)
156
        exporter.run()
157
158
    commands = {
159
        "capabilities": cmd_capabilities,
160
        "list": cmd_list,
161
        "option": cmd_option,
162
        "fetch": cmd_fetch,
163
        "push": cmd_push,
164
        "import": cmd_import,
165
        }
166
167
    def process(self, inf, outf):
168
        while True:
169
            l = inf.readline()
170
            if not l:
171
                break
172
            self.process_line(l, outf)
173
174
    def process_line(self, l, outf):
175
        argv = l.strip().split()
176
        if argv == []:
177
            if self.batchcmd == "fetch":
178
                fetch(outf, self.wants, self.shortname, self.remote_dir, self.local_dir)
179
            elif self.batchcmd == "push":
180
                push(outf, self.wants, self.shortname, self.remote_dir, self.local_dir)
181
            elif self.batchcmd is None:
182
                return
183
            else:
184
                raise AssertionError("invalid batch %r" % self.batchcmd)
185
            self.batchcmd = None
186
        else:
187
            try:
188
               self.commands[argv[0]](self, outf, argv)
189
            except KeyError:
190
               raise Exception("Unknown remote command %r" % argv)
191
        outf.flush()
192
193
194
def open_local_dir():
195
    try:
196
        git_path = os.environ["GIT_DIR"]
197
    except KeyError:
198
        git_transport = get_transport_from_path(".")
199
        git_format = LocalGitProber().probe_transport(git_transport)
200
    else:
201
        if git_path.endswith("/.git"):
202
            git_format = LocalGitControlDirFormat()
203
            git_path = git_path[:-4]
204
        else:
205
            git_format = BareLocalGitControlDirFormat()
206
        git_transport = get_transport_from_path(git_path)
207
208
    return git_format.open(git_transport)