/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
7476.2.1 by Jelmer Vernooij
Default to running Python 3.
1
#!/usr/bin/env python3
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
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
23
CAPABILITIES = ["fetch", "option", "push"]
24
25
import os
26
6986.2.1 by Jelmer Vernooij
Move breezy.plugins.git to breezy.git.
27
from ..controldir import ControlDir
28
from ..errors import NotBranchError, NoRepositoryPresent
29
from ..repository import InterRepository
30
from ..transport import get_transport_from_path
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
31
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
32
from . import (
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
33
    LocalGitProber,
34
    )
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
35
from .dir import (
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
36
    BareLocalGitControlDirFormat,
37
    LocalGitControlDirFormat,
38
    )
39
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
40
from .object_store import (
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
41
    get_object_store,
42
    )
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
43
from .refs import (
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
44
    get_refs_container,
45
    ref_to_branch_name,
46
    )
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
47
from .repository import (
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
48
    GitRepository,
49
    )
50
6986.2.1 by Jelmer Vernooij
Move breezy.plugins.git to breezy.git.
51
from ..plugins.fastimport import exporter as fastexporter
0.337.1 by Jelmer Vernooij
Various git remote helper fixes.
52
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
53
try:
7143.11.1 by Jelmer Vernooij
Remove some unused imports.
54
    import fastimport  # noqa: F401
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
55
except ImportError:
0.337.1 by Jelmer Vernooij
Various git remote helper fixes.
56
    pass
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
57
else:
58
    CAPABILITIES.append("import")
7463.3.1 by Jelmer Vernooij
Advertise refspec *:*, to stop warnings from git.
59
    CAPABILITIES.append("refspec *:*")
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
60
7143.15.2 by Jelmer Vernooij
Run autopep8.
61
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
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
7143.15.2 by Jelmer Vernooij
Run autopep8.
77
            isinstance(local_repo, GitRepository)):
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
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)
6973.5.10 by Jelmer Vernooij
Random bunch of python3 bee-improvements.
82
    outf.write(b"\n")
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
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)
6973.5.10 by Jelmer Vernooij
Random bunch of python3 bee-improvements.
96
        outf.write(b"ok %s\n" % dest_ref)
97
    outf.write(b"\n")
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
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):
7143.15.2 by Jelmer Vernooij
Run autopep8.
111
        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.
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)
7479.2.1 by Jelmer Vernooij
Drop python2 support.
121
            for ref, git_sha1 in refs.as_dict().items():
7018.3.8 by Jelmer Vernooij
Disable some flaky tests on python3, allow running without fastimport.
122
                ref = ref.replace(b"~", b"_")
6973.5.10 by Jelmer Vernooij
Random bunch of python3 bee-improvements.
123
                outf.write(b"%s %s\n" % (git_sha1, ref))
124
            outf.write(b"\n")
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
125
126
    def cmd_option(self, outf, argv):
6973.5.10 by Jelmer Vernooij
Random bunch of python3 bee-improvements.
127
        outf.write(b"unsupported\n")
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
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")
7045.4.8 by Jelmer Vernooij
Fix another 128 tests on python 3.
144
        ref = argv[1].encode('utf-8')
145
        dest_branch_name = ref_to_branch_name(ref)
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
146
        if dest_branch_name == "master":
147
            dest_branch_name = None
148
        remote_branch = self.remote_dir.open_branch(name=dest_branch_name)
7143.15.3 by Jelmer Vernooij
Fix pep8 issues in breezy.git.
149
        exporter = fastexporter.BzrFastExporter(
150
            remote_branch, outf=outf, ref=ref, checkpoint=None,
151
            import_marks_file=None, export_marks_file=None, revision=None,
152
            verbose=None, plain_format=True, rewrite_tags=False)
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
153
        exporter.run()
154
155
    commands = {
156
        "capabilities": cmd_capabilities,
157
        "list": cmd_list,
158
        "option": cmd_option,
159
        "fetch": cmd_fetch,
160
        "push": cmd_push,
161
        "import": cmd_import,
162
        }
163
164
    def process(self, inf, outf):
165
        while True:
7143.15.3 by Jelmer Vernooij
Fix pep8 issues in breezy.git.
166
            line = inf.readline()
167
            if not line:
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
168
                break
7143.15.3 by Jelmer Vernooij
Fix pep8 issues in breezy.git.
169
            self.process_line(line, outf)
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
170
171
    def process_line(self, l, outf):
172
        argv = l.strip().split()
173
        if argv == []:
174
            if self.batchcmd == "fetch":
7143.15.2 by Jelmer Vernooij
Run autopep8.
175
                fetch(outf, self.wants, self.shortname,
176
                      self.remote_dir, self.local_dir)
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
177
            elif self.batchcmd == "push":
7143.15.2 by Jelmer Vernooij
Run autopep8.
178
                push(outf, self.wants, self.shortname,
179
                     self.remote_dir, self.local_dir)
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
180
            elif self.batchcmd is None:
181
                return
182
            else:
183
                raise AssertionError("invalid batch %r" % self.batchcmd)
184
            self.batchcmd = None
185
        else:
186
            try:
7290.11.8 by Jelmer Vernooij
Fix tests on Python 3.
187
                self.commands[argv[0].decode()](self, outf, argv)
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
188
            except KeyError:
7143.15.2 by Jelmer Vernooij
Run autopep8.
189
                raise Exception("Unknown remote command %r" % argv)
0.200.1514 by Jelmer Vernooij
Move git_remote_helper to a python module.
190
        outf.flush()
191
192
193
def open_local_dir():
194
    try:
195
        git_path = os.environ["GIT_DIR"]
196
    except KeyError:
197
        git_transport = get_transport_from_path(".")
198
        git_format = LocalGitProber().probe_transport(git_transport)
199
    else:
200
        if git_path.endswith("/.git"):
201
            git_format = LocalGitControlDirFormat()
202
            git_path = git_path[:-4]
203
        else:
204
            git_format = BareLocalGitControlDirFormat()
205
        git_transport = get_transport_from_path(git_path)
206
207
    return git_format.open(git_transport)