/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.358.2 by Jelmer Vernooij
Refresh copyright headers, add my email.
1
# Copyright (C) 2007-2018 Jelmer Vernooij <jelmer@jelmer.uk>
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
0.358.1 by Jelmer Vernooij
Fix FSF address.
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
16
0.358.3 by Jelmer Vernooij
Enable absolute import.
17
"""Remote dirs, repositories and branches."""
18
0.200.1594 by Jelmer Vernooij
Use absolute_import everywhere.
19
from __future__ import absolute_import
20
7143.15.3 by Jelmer Vernooij
Fix pep8 issues in breezy.git.
21
import gzip
7404.5.3 by Jelmer Vernooij
Reuse connections.
22
from io import BytesIO
0.405.1 by Jelmer Vernooij
Use same logic for interpreting progress reports everywhere.
23
import re
24
6986.2.1 by Jelmer Vernooij
Move breezy.plugins.git to breezy.git.
25
from .. import (
0.200.596 by Jelmer Vernooij
Import RemoteGitBranch._get_config().
26
    config,
0.200.707 by Jelmer Vernooij
Add debug routines.
27
    debug,
0.404.5 by Jelmer Vernooij
Check for diverged branches during push.
28
    errors,
6968.4.4 by Jelmer Vernooij
Update for API changes from archive branch.
29
    osutils,
0.200.586 by Jelmer Vernooij
Fix issues pointed out by pyflakes.
30
    trace,
0.200.333 by Jelmer Vernooij
Support progress reporting when creating index.
31
    ui,
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
32
    urlutils,
33
    )
6986.2.1 by Jelmer Vernooij
Move breezy.plugins.git to breezy.git.
34
from ..push import (
0.401.4 by Jelmer Vernooij
Implement RemoteGitDir.push_branch.
35
    PushResult,
36
    )
6986.2.1 by Jelmer Vernooij
Move breezy.plugins.git to breezy.git.
37
from ..errors import (
0.382.1 by Jelmer Vernooij
Various fixes for annotated tags and symrefs.
38
    AlreadyBranchError,
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
39
    BzrError,
0.404.5 by Jelmer Vernooij
Check for diverged branches during push.
40
    DivergedBranches,
0.200.1412 by Jelmer Vernooij
Implement GitControlDirFormat.supports_transport.
41
    InProcessTransport,
0.200.415 by Jelmer Vernooij
make 'bzr pull --revision' work for remote repositories.
42
    InvalidRevisionId,
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
43
    NoSuchFile,
0.200.415 by Jelmer Vernooij
make 'bzr pull --revision' work for remote repositories.
44
    NoSuchRevision,
0.377.1 by Jelmer Vernooij
Fix some remote operations and add more tests.
45
    NoSuchTag,
0.200.1137 by Jelmer Vernooij
Support BzrProber.known_formats().
46
    NotBranchError,
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
47
    NotLocalUrl,
7103.1.2 by Jelmer Vernooij
Handle PermissionDenied.
48
    PermissionDenied,
0.200.1137 by Jelmer Vernooij
Support BzrProber.known_formats().
49
    UninitializableFormat,
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
50
    )
7484.1.2 by Jelmer Vernooij
Add some tests.
51
from ..revision import NULL_REVISION
6986.2.1 by Jelmer Vernooij
Move breezy.plugins.git to breezy.git.
52
from ..revisiontree import RevisionTree
7289.1.2 by Jelmer Vernooij
Fix pushing of tags as part of nascent git branches.
53
from ..sixish import (
54
    text_type,
55
    viewitems,
56
    )
6986.2.1 by Jelmer Vernooij
Move breezy.plugins.git to breezy.git.
57
from ..transport import (
0.200.292 by Jelmer Vernooij
Fix formatting.
58
    Transport,
6964.2.1 by Jelmer Vernooij
Initial work to support brz-git on python3.
59
    register_urlparse_netloc_protocol,
0.200.292 by Jelmer Vernooij
Fix formatting.
60
    )
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
61
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
62
from . import (
0.200.292 by Jelmer Vernooij
Fix formatting.
63
    lazy_check_versions,
7359.1.1 by Jelmer Vernooij
Only set user agent for GitHub.
64
    is_github_url,
0.409.2 by Jelmer Vernooij
call out to HTTP transport rather than creating new connection.
65
    user_agent_for_github,
0.200.292 by Jelmer Vernooij
Fix formatting.
66
    )
0.200.200 by Jelmer Vernooij
Register lazily where possible.
67
lazy_check_versions()
68
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
69
from .branch import (
0.200.292 by Jelmer Vernooij
Fix formatting.
70
    GitBranch,
0.295.1 by Jelmer Vernooij
Split up branch formats.
71
    GitBranchFormat,
0.403.3 by Jelmer Vernooij
Test RemoteGitDir.push_branch.
72
    GitBranchPushResult,
0.200.1064 by Jelmer Vernooij
Use common base class for tags.
73
    GitTags,
0.406.2 by Jelmer Vernooij
Add tests.
74
    _quick_lookup_revno,
0.200.292 by Jelmer Vernooij
Fix formatting.
75
    )
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
76
from .dir import (
0.200.1137 by Jelmer Vernooij
Support BzrProber.known_formats().
77
    GitControlDirFormat,
78
    GitDir,
79
    )
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
80
from .errors import (
0.200.319 by Jelmer Vernooij
Print proper error when trying unsupported operations against a git server.
81
    GitSmartRemoteNotSupported,
0.200.292 by Jelmer Vernooij
Fix formatting.
82
    NoSuchRef,
83
    )
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
84
from .mapping import (
0.200.415 by Jelmer Vernooij
make 'bzr pull --revision' work for remote repositories.
85
    mapping_registry,
86
    )
0.401.4 by Jelmer Vernooij
Implement RemoteGitDir.push_branch.
87
from .object_store import (
88
    get_object_store,
89
    )
0.404.5 by Jelmer Vernooij
Check for diverged branches during push.
90
from .push import (
91
    remote_divergence,
92
    )
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
93
from .repository import (
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
94
    GitRepository,
7290.20.3 by Jelmer Vernooij
Fix tests for git/full history branches.
95
    GitRepositoryFormat,
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
96
    )
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
97
from .refs import (
0.200.872 by Jelmer Vernooij
Move refs code to separate module.
98
    branch_name_to_ref,
0.200.1487 by Jelmer Vernooij
Use peeling.
99
    is_peeled,
0.375.1 by Jelmer Vernooij
Fix remote tests, warn when fetching git->bzr and bzr->git.
100
    ref_to_tag_name,
0.377.1 by Jelmer Vernooij
Fix some remote operations and add more tests.
101
    tag_name_to_ref,
0.200.872 by Jelmer Vernooij
Move refs code to separate module.
102
    )
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
103
0.200.1336 by Jelmer Vernooij
Support the git smart server http protocol.
104
import dulwich
105
import dulwich.client
0.200.292 by Jelmer Vernooij
Fix formatting.
106
from dulwich.errors import (
107
    GitProtocolError,
7143.2.1 by Jelmer Vernooij
Don't hardcode the list of supported archive formats.
108
    HangupException,
0.200.292 by Jelmer Vernooij
Fix formatting.
109
    )
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
110
from dulwich.pack import (
111
    Pack,
0.377.1 by Jelmer Vernooij
Fix some remote operations and add more tests.
112
    pack_objects_to_data,
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
113
    )
0.403.3 by Jelmer Vernooij
Test RemoteGitDir.push_branch.
114
from dulwich.protocol import ZERO_SHA
0.409.2 by Jelmer Vernooij
call out to HTTP transport rather than creating new connection.
115
from dulwich.refs import (
116
    DictRefsContainer,
117
    SYMREF,
118
    )
119
from dulwich.repo import (
120
    NotGitRepository,
121
    )
0.200.167 by Jelmer Vernooij
Implement fetch_objects properly.
122
import os
0.200.1624 by Jelmer Vernooij
Add ssh vendor for dulwich that uses the bzr ssh vendor.
123
import select
0.200.167 by Jelmer Vernooij
Implement fetch_objects properly.
124
import tempfile
6964.2.1 by Jelmer Vernooij
Initial work to support brz-git on python3.
125
126
try:
127
    import urllib.parse as urlparse
7290.38.1 by Jelmer Vernooij
Backport python3.8 support patch to breezy 3.0.
128
    from urllib.parse import splituser
6964.2.1 by Jelmer Vernooij
Initial work to support brz-git on python3.
129
except ImportError:
130
    import urlparse
7290.38.1 by Jelmer Vernooij
Backport python3.8 support patch to breezy 3.0.
131
    from urllib import splituser
0.200.1555 by Jelmer Vernooij
Remove segment parameters for http smart transports.
132
133
# urlparse only supports a limited number of schemes by default
6964.2.1 by Jelmer Vernooij
Initial work to support brz-git on python3.
134
register_urlparse_netloc_protocol('git')
135
register_urlparse_netloc_protocol('git+ssh')
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
136
0.200.586 by Jelmer Vernooij
Fix issues pointed out by pyflakes.
137
from dulwich.pack import load_pack_index
0.200.306 by Jelmer Vernooij
Fix tests, split up InterGitNonGitRepository.
138
0.200.143 by Jelmer Vernooij
Reoncile InterGitRepository objects.
139
0.406.1 by Jelmer Vernooij
Properly lookup revnos for brz-git push result.
140
class GitPushResult(PushResult):
141
142
    def _lookup_revno(self, revid):
0.406.2 by Jelmer Vernooij
Add tests.
143
        try:
144
            return _quick_lookup_revno(self.source_branch, self.target_branch,
7143.15.2 by Jelmer Vernooij
Run autopep8.
145
                                       revid)
0.406.2 by Jelmer Vernooij
Add tests.
146
        except GitSmartRemoteNotSupported:
147
            return None
0.406.1 by Jelmer Vernooij
Properly lookup revnos for brz-git push result.
148
149
    @property
150
    def old_revno(self):
151
        return self._lookup_revno(self.old_revid)
152
153
    @property
154
    def new_revno(self):
155
        return self._lookup_revno(self.new_revid)
156
157
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
158
# Don't run any tests on GitSmartTransport as it is not intended to be
0.200.181 by Jelmer Vernooij
Support setting tags.
159
# a full implementation of Transport
160
def get_test_permutations():
161
    return []
162
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
163
0.200.708 by Jelmer Vernooij
Factor out URL parsing.
164
def split_git_url(url):
0.200.709 by Jelmer Vernooij
When unpacking URLs, strip leftmost slash to match gits behaviour.
165
    """Split a Git URL.
166
167
    :param url: Git URL
168
    :return: Tuple with host, port, username, path.
169
    """
7290.38.1 by Jelmer Vernooij
Backport python3.8 support patch to breezy 3.0.
170
    parsed_url = urlparse.urlparse(url)
171
    path = urlparse.unquote(parsed_url.path)
0.246.2 by Jelmer Vernooij
Improve the fix dealing with git repo's in home directories.
172
    if path.startswith("/~"):
0.200.709 by Jelmer Vernooij
When unpacking URLs, strip leftmost slash to match gits behaviour.
173
        path = path[1:]
7290.38.1 by Jelmer Vernooij
Backport python3.8 support patch to breezy 3.0.
174
    return ((parsed_url.hostname or '', parsed_url.port, parsed_url.username, path))
0.200.708 by Jelmer Vernooij
Factor out URL parsing.
175
176
0.200.1562 by Jelmer Vernooij
Add separate exception for remote errors.
177
class RemoteGitError(BzrError):
178
0.290.1 by Jelmer Vernooij
Avoid 'message' argument in RemoteGitError; apparently it breaks some versions of Python.
179
    _fmt = "Remote server error: %(msg)s"
0.200.1562 by Jelmer Vernooij
Add separate exception for remote errors.
180
181
7103.1.1 by Jelmer Vernooij
Improved error parsing for Git branches.
182
class HeadUpdateFailed(BzrError):
183
184
    _fmt = ("Unable to update remote HEAD branch. To update the master "
185
            "branch, specify the URL %(base_url)s,branch=master.")
186
187
    def __init__(self, base_url):
188
        super(HeadUpdateFailed, self).__init__()
189
        self.base_url = base_url
190
191
0.200.1275 by Jelmer Vernooij
recognize missing repositories
192
def parse_git_error(url, message):
193
    """Parse a remote git server error and return a bzr exception.
194
195
    :param url: URL of the remote repository
196
    :param message: Message sent by the remote git server
197
    """
198
    message = str(message).strip()
7143.15.2 by Jelmer Vernooij
Run autopep8.
199
    if (message.startswith("Could not find Repository ")
200
        or message == 'Repository not found.'
7143.15.3 by Jelmer Vernooij
Fix pep8 issues in breezy.git.
201
            or (message.startswith('Repository ') and
202
                message.endswith(' not found.'))):
0.200.1275 by Jelmer Vernooij
recognize missing repositories
203
        return NotBranchError(url, message)
0.200.1563 by Jelmer Vernooij
Improve error message.
204
    if message == "HEAD failed to update":
7441.1.1 by Jelmer Vernooij
Add strip_segment_parameters function.
205
        base_url = urlutils.strip_segment_parameters(url)
7103.1.1 by Jelmer Vernooij
Improved error parsing for Git branches.
206
        return HeadUpdateFailed(base_url)
7103.1.2 by Jelmer Vernooij
Handle PermissionDenied.
207
    if message.startswith('access denied or repository not exported:'):
7428.1.2 by Jelmer Vernooij
Don't require head whitespace.
208
        extra, path = message.split(':', 1)
209
        return PermissionDenied(path.strip(), extra)
7131.7.4 by Jelmer Vernooij
Don't use GitLab string.
210
    if message.endswith('You are not allowed to push code to this project.'):
7131.7.2 by Jelmer Vernooij
Handle github PermissionDenied.
211
        return PermissionDenied(url, message)
7131.7.3 by Jelmer Vernooij
Handle one more error.
212
    if message.endswith(' does not appear to be a git repository'):
213
        return NotBranchError(url, message)
7379.1.1 by Jelmer Vernooij
Handle invalid repository name on GitHub.
214
    if re.match('(.+) is not a valid repository name',
215
                message.splitlines()[0]):
216
        return NotBranchError(url, message)
7131.7.2 by Jelmer Vernooij
Handle github PermissionDenied.
217
    m = re.match(r'Permission to ([^ ]+) denied to ([^ ]+)\.', message)
218
    if m:
219
        return PermissionDenied(m.group(1), 'denied to %s' % m.group(2))
0.200.1275 by Jelmer Vernooij
recognize missing repositories
220
    # Don't know, just return it to the user as-is
0.200.1562 by Jelmer Vernooij
Add separate exception for remote errors.
221
    return RemoteGitError(message)
0.200.1275 by Jelmer Vernooij
recognize missing repositories
222
223
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
224
class GitSmartTransport(Transport):
225
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
226
    def __init__(self, url, _client=None):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
227
        Transport.__init__(self, url)
0.200.708 by Jelmer Vernooij
Factor out URL parsing.
228
        (self._host, self._port, self._username, self._path) = \
229
            split_git_url(url)
0.200.707 by Jelmer Vernooij
Add debug routines.
230
        if 'transport' in debug.debug_flags:
231
            trace.mutter('host: %r, user: %r, port: %r, path: %r',
232
                         self._host, self._username, self._port, self._path)
0.200.166 by Jelmer Vernooij
don't reuse client objects.
233
        self._client = _client
0.200.1464 by Jelmer Vernooij
Warn about ignoring path segment parameters when using bzr 2.4.
234
        self._stripped_path = self._path.rsplit(",", 1)[0]
0.200.166 by Jelmer Vernooij
don't reuse client objects.
235
0.200.543 by Jelmer Vernooij
Implement GitSmartTransport.external_url().
236
    def external_url(self):
237
        return self.base
238
0.200.238 by Jelmer Vernooij
Import Transport.has().
239
    def has(self, relpath):
240
        return False
241
0.344.1 by Jelmer Vernooij
Allow using local git executable by accessing git:///some/path.
242
    def _get_client(self):
0.200.307 by Jelmer Vernooij
Support git+ssh.
243
        raise NotImplementedError(self._get_client)
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
244
0.200.470 by Jelmer Vernooij
Properly parse username in URLs.
245
    def _get_path(self):
0.200.1464 by Jelmer Vernooij
Warn about ignoring path segment parameters when using bzr 2.4.
246
        return self._stripped_path
0.200.470 by Jelmer Vernooij
Properly parse username in URLs.
247
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
248
    def get(self, path):
249
        raise NoSuchFile(path)
250
0.200.160 by Jelmer Vernooij
Implement abspath.
251
    def abspath(self, relpath):
252
        return urlutils.join(self.base, relpath)
253
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
254
    def clone(self, offset=None):
255
        """See Transport.clone()."""
256
        if offset is None:
257
            newurl = self.base
258
        else:
259
            newurl = urlutils.join(self.base, offset)
260
0.200.307 by Jelmer Vernooij
Support git+ssh.
261
        return self.__class__(newurl, self._client)
262
263
264
class TCPGitSmartTransport(GitSmartTransport):
265
0.200.332 by Jelmer Vernooij
Support activity reporting.
266
    _scheme = 'git'
267
0.344.1 by Jelmer Vernooij
Allow using local git executable by accessing git:///some/path.
268
    def _get_client(self):
0.200.307 by Jelmer Vernooij
Support git+ssh.
269
        if self._client is not None:
270
            ret = self._client
271
            self._client = None
272
            return ret
0.344.1 by Jelmer Vernooij
Allow using local git executable by accessing git:///some/path.
273
        if self._host == '':
0.382.1 by Jelmer Vernooij
Various fixes for annotated tags and symrefs.
274
            # return dulwich.client.LocalGitClient()
275
            return dulwich.client.SubprocessGitClient()
7143.15.3 by Jelmer Vernooij
Fix pep8 issues in breezy.git.
276
        return dulwich.client.TCPGitClient(
277
            self._host, self._port, report_activity=self._report_activity)
0.200.307 by Jelmer Vernooij
Support git+ssh.
278
279
0.200.1624 by Jelmer Vernooij
Add ssh vendor for dulwich that uses the bzr ssh vendor.
280
class SSHSocketWrapper(object):
281
282
    def __init__(self, sock):
283
        self.sock = sock
284
285
    def read(self, len=None):
286
        return self.sock.recv(len)
287
288
    def write(self, data):
289
        return self.sock.write(data)
290
291
    def can_read(self):
292
        return len(select.select([self.sock.fileno()], [], [], 0)[0]) > 0
293
294
295
class DulwichSSHVendor(dulwich.client.SSHVendor):
296
297
    def __init__(self):
6986.2.1 by Jelmer Vernooij
Move breezy.plugins.git to breezy.git.
298
        from ..transport import ssh
0.200.1624 by Jelmer Vernooij
Add ssh vendor for dulwich that uses the bzr ssh vendor.
299
        self.bzr_ssh_vendor = ssh._get_ssh_vendor()
300
301
    def run_command(self, host, command, username=None, port=None):
7143.15.3 by Jelmer Vernooij
Fix pep8 issues in breezy.git.
302
        connection = self.bzr_ssh_vendor.connect_ssh(
303
            username=username, password=None, port=port, host=host,
304
            command=command)
0.200.1624 by Jelmer Vernooij
Add ssh vendor for dulwich that uses the bzr ssh vendor.
305
        (kind, io_object) = connection.get_sock_or_pipes()
306
        if kind == 'socket':
307
            return SSHSocketWrapper(io_object)
308
        else:
309
            raise AssertionError("Unknown io object kind %r'" % kind)
310
311
7143.15.3 by Jelmer Vernooij
Fix pep8 issues in breezy.git.
312
# dulwich.client.get_ssh_vendor = DulwichSSHVendor
0.200.1624 by Jelmer Vernooij
Add ssh vendor for dulwich that uses the bzr ssh vendor.
313
314
0.200.307 by Jelmer Vernooij
Support git+ssh.
315
class SSHGitSmartTransport(GitSmartTransport):
316
0.200.332 by Jelmer Vernooij
Support activity reporting.
317
    _scheme = 'git+ssh'
318
0.200.470 by Jelmer Vernooij
Properly parse username in URLs.
319
    def _get_path(self):
0.200.1464 by Jelmer Vernooij
Warn about ignoring path segment parameters when using bzr 2.4.
320
        path = self._stripped_path
0.200.1318 by Jelmer Vernooij
Strip segment parameters where necessary.
321
        if path.startswith("/~/"):
322
            return path[3:]
323
        return path
0.200.470 by Jelmer Vernooij
Properly parse username in URLs.
324
0.344.1 by Jelmer Vernooij
Allow using local git executable by accessing git:///some/path.
325
    def _get_client(self):
0.200.307 by Jelmer Vernooij
Support git+ssh.
326
        if self._client is not None:
327
            ret = self._client
328
            self._client = None
329
            return ret
0.253.1 by Ross Light
Added configuration options for git-upload-pack and git-receive-pack
330
        location_config = config.LocationConfig(self.base)
7143.15.3 by Jelmer Vernooij
Fix pep8 issues in breezy.git.
331
        client = dulwich.client.SSHGitClient(
332
            self._host, self._port, self._username,
333
            report_activity=self._report_activity)
0.253.1 by Ross Light
Added configuration options for git-upload-pack and git-receive-pack
334
        # Set up alternate pack program paths
335
        upload_pack = location_config.get_user_option('git_upload_pack')
336
        if upload_pack:
0.200.949 by Jelmer Vernooij
merge support for specifying alternative paths for git executables.
337
            client.alternative_paths["upload-pack"] = upload_pack
0.253.1 by Ross Light
Added configuration options for git-upload-pack and git-receive-pack
338
        receive_pack = location_config.get_user_option('git_receive_pack')
339
        if receive_pack:
0.200.949 by Jelmer Vernooij
merge support for specifying alternative paths for git executables.
340
            client.alternative_paths["receive-pack"] = receive_pack
0.253.1 by Ross Light
Added configuration options for git-upload-pack and git-receive-pack
341
        return client
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
342
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
343
0.295.1 by Jelmer Vernooij
Split up branch formats.
344
class RemoteGitBranchFormat(GitBranchFormat):
345
346
    def get_format_description(self):
347
        return 'Remote Git Branch'
348
349
    @property
350
    def _matchingcontroldir(self):
351
        return RemoteGitControlDirFormat()
352
0.295.2 by Jelmer Vernooij
Make RemoteGitBranchFormat uninitializeable.
353
    def initialize(self, a_controldir, name=None, repository=None,
354
                   append_revisions_only=None):
355
        raise UninitializableFormat(self)
356
0.295.1 by Jelmer Vernooij
Split up branch formats.
357
0.407.1 by Jelmer Vernooij
Improve progress reporting.
358
class DefaultProgressReporter(object):
359
360
    _GIT_PROGRESS_PARTIAL_RE = re.compile(r"(.*?): +(\d+)% \((\d+)/(\d+)\)")
361
    _GIT_PROGRESS_TOTAL_RE = re.compile(r"(.*?): (\d+)")
362
363
    def __init__(self, pb):
364
        self.pb = pb
365
366
    def progress(self, text):
7018.3.2 by Jelmer Vernooij
Fix some git tests.
367
        text = text.rstrip(b"\r\n")
368
        text = text.decode('utf-8')
7131.7.1 by Jelmer Vernooij
Handle permission denied by GitLab.
369
        if text.lower().startswith('error: '):
7018.3.2 by Jelmer Vernooij
Fix some git tests.
370
            trace.show_error('git: %s', text[len(b'error: '):])
0.405.1 by Jelmer Vernooij
Use same logic for interpreting progress reports everywhere.
371
        else:
0.407.1 by Jelmer Vernooij
Improve progress reporting.
372
            trace.mutter("git: %s", text)
373
            g = self._GIT_PROGRESS_PARTIAL_RE.match(text)
0.405.1 by Jelmer Vernooij
Use same logic for interpreting progress reports everywhere.
374
            if g is not None:
0.407.1 by Jelmer Vernooij
Improve progress reporting.
375
                (text, pct, current, total) = g.groups()
376
                self.pb.update(text, int(current), int(total))
0.405.1 by Jelmer Vernooij
Use same logic for interpreting progress reports everywhere.
377
            else:
0.407.1 by Jelmer Vernooij
Improve progress reporting.
378
                g = self._GIT_PROGRESS_TOTAL_RE.match(text)
379
                if g is not None:
380
                    (text, total) = g.groups()
381
                    self.pb.update(text, None, int(total))
382
                else:
383
                    trace.note("%s", text)
0.382.1 by Jelmer Vernooij
Various fixes for annotated tags and symrefs.
384
385
0.200.148 by Jelmer Vernooij
Share more infrastructure between LocalGitDir and RemoteGitDir.
386
class RemoteGitDir(GitDir):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
387
0.344.1 by Jelmer Vernooij
Allow using local git executable by accessing git:///some/path.
388
    def __init__(self, transport, format, client, client_path):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
389
        self._format = format
390
        self.root_transport = transport
391
        self.transport = transport
0.200.381 by Jelmer Vernooij
Support working trees properly, status and ls.
392
        self._mode_check_done = None
0.344.1 by Jelmer Vernooij
Allow using local git executable by accessing git:///some/path.
393
        self._client = client
0.200.1336 by Jelmer Vernooij
Support the git smart server http protocol.
394
        self._client_path = client_path
0.200.1396 by Jelmer Vernooij
Support updating tags in remote branches during pull.
395
        self.base = self.root_transport.base
0.200.1434 by Jelmer Vernooij
Move refs access to control dir.
396
        self._refs = None
0.200.1335 by Jelmer Vernooij
Move _get_client.
397
0.322.1 by Jelmer Vernooij
Fix access of remote git branches.
398
    @property
399
    def _gitrepository_class(self):
400
        return RemoteGitRepository
401
7143.15.3 by Jelmer Vernooij
Fix pep8 issues in breezy.git.
402
    def archive(self, format, committish, write_data, progress=None,
7143.2.1 by Jelmer Vernooij
Don't hardcode the list of supported archive formats.
403
                write_error=None, subdirs=None, prefix=None):
6968.4.1 by Jelmer Vernooij
Add support for exporting archives in Git.
404
        if progress is None:
405
            pb = ui.ui_factory.nested_progress_bar()
406
            progress = DefaultProgressReporter(pb).progress
407
        else:
408
            pb = None
7143.2.1 by Jelmer Vernooij
Don't hardcode the list of supported archive formats.
409
        def progress_wrapper(message):
410
            if message.startswith(b"fatal: Unknown archive format \'"):
411
                format = message.strip()[len(b"fatal: Unknown archive format '"):-1]
412
                raise errors.NoSuchExportFormat(format.decode('ascii'))
413
            return progress(message)
6968.4.1 by Jelmer Vernooij
Add support for exporting archives in Git.
414
        try:
7143.15.3 by Jelmer Vernooij
Fix pep8 issues in breezy.git.
415
            self._client.archive(
7143.2.1 by Jelmer Vernooij
Don't hardcode the list of supported archive formats.
416
                self._client_path, committish, write_data, progress_wrapper,
417
                write_error,
418
                format=(format.encode('ascii') if format else None),
419
                subdirs=subdirs,
420
                prefix=(prefix.encode('utf-8') if prefix else None))
6968.4.1 by Jelmer Vernooij
Add support for exporting archives in Git.
421
        except GitProtocolError as e:
422
            raise parse_git_error(self.transport.external_url(), e)
423
        finally:
424
            if pb is not None:
425
                pb.finished()
426
7143.15.3 by Jelmer Vernooij
Fix pep8 issues in breezy.git.
427
    def fetch_pack(self, determine_wants, graph_walker, pack_data,
428
                   progress=None):
0.200.1335 by Jelmer Vernooij
Move _get_client.
429
        if progress is None:
0.405.1 by Jelmer Vernooij
Use same logic for interpreting progress reports everywhere.
430
            pb = ui.ui_factory.nested_progress_bar()
0.407.1 by Jelmer Vernooij
Improve progress reporting.
431
            progress = DefaultProgressReporter(pb).progress
0.405.1 by Jelmer Vernooij
Use same logic for interpreting progress reports everywhere.
432
        else:
433
            pb = None
0.200.1335 by Jelmer Vernooij
Move _get_client.
434
        try:
7143.15.3 by Jelmer Vernooij
Fix pep8 issues in breezy.git.
435
            result = self._client.fetch_pack(
436
                self._client_path, determine_wants, graph_walker, pack_data,
437
                progress)
0.376.1 by Jelmer Vernooij
Add tests for remote operations.
438
            if result.refs is None:
439
                result.refs = {}
7143.15.2 by Jelmer Vernooij
Run autopep8.
440
            self._refs = remote_refs_dict_to_container(
441
                result.refs, result.symrefs)
0.377.1 by Jelmer Vernooij
Fix some remote operations and add more tests.
442
            return result
6964.2.1 by Jelmer Vernooij
Initial work to support brz-git on python3.
443
        except GitProtocolError as e:
0.200.1335 by Jelmer Vernooij
Move _get_client.
444
            raise parse_git_error(self.transport.external_url(), e)
0.405.1 by Jelmer Vernooij
Use same logic for interpreting progress reports everywhere.
445
        finally:
446
            if pb is not None:
447
                pb.finished()
0.200.1335 by Jelmer Vernooij
Move _get_client.
448
0.382.1 by Jelmer Vernooij
Various fixes for annotated tags and symrefs.
449
    def send_pack(self, get_changed_refs, generate_pack_data, progress=None):
450
        if progress is None:
0.405.1 by Jelmer Vernooij
Use same logic for interpreting progress reports everywhere.
451
            pb = ui.ui_factory.nested_progress_bar()
0.407.1 by Jelmer Vernooij
Improve progress reporting.
452
            progress = DefaultProgressReporter(pb).progress
0.405.1 by Jelmer Vernooij
Use same logic for interpreting progress reports everywhere.
453
        else:
454
            pb = None
7143.15.2 by Jelmer Vernooij
Run autopep8.
455
7484.1.1 by Jelmer Vernooij
Follow symrefs when pushing to git repositories.
456
        def get_changed_refs_wrapper(remote_refs):
7484.1.2 by Jelmer Vernooij
Add some tests.
457
            if self._refs is not None:
458
                update_refs_container(self._refs, remote_refs)
7484.1.1 by Jelmer Vernooij
Follow symrefs when pushing to git repositories.
459
            return get_changed_refs(remote_refs)
0.200.1335 by Jelmer Vernooij
Move _get_client.
460
        try:
7143.15.3 by Jelmer Vernooij
Fix pep8 issues in breezy.git.
461
            return self._client.send_pack(
462
                self._client_path, get_changed_refs_wrapper,
463
                generate_pack_data, progress)
6964.2.1 by Jelmer Vernooij
Initial work to support brz-git on python3.
464
        except GitProtocolError as e:
0.200.1335 by Jelmer Vernooij
Move _get_client.
465
            raise parse_git_error(self.transport.external_url(), e)
0.405.1 by Jelmer Vernooij
Use same logic for interpreting progress reports everywhere.
466
        finally:
467
            if pb is not None:
468
                pb.finished()
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
469
0.382.1 by Jelmer Vernooij
Various fixes for annotated tags and symrefs.
470
    def create_branch(self, name=None, repository=None,
471
                      append_revisions_only=None, ref=None):
472
        refname = self._get_selected_ref(name, ref)
473
        if refname != b'HEAD' and refname in self.get_refs_container():
474
            raise AlreadyBranchError(self.user_url)
7484.1.1 by Jelmer Vernooij
Follow symrefs when pushing to git repositories.
475
        ref_chain, unused_sha = self.get_refs_container().follow(
7484.1.2 by Jelmer Vernooij
Add some tests.
476
            self._get_selected_ref(name))
7484.1.1 by Jelmer Vernooij
Follow symrefs when pushing to git repositories.
477
        if ref_chain and ref_chain[0] == b'HEAD':
478
            refname = ref_chain[1]
0.382.1 by Jelmer Vernooij
Various fixes for annotated tags and symrefs.
479
        repo = self.open_repository()
480
        return RemoteGitBranch(self, repo, refname)
481
0.200.1393 by Jelmer Vernooij
Implement removal of remote branches.
482
    def destroy_branch(self, name=None):
483
        refname = self._get_selected_ref(name)
7143.15.2 by Jelmer Vernooij
Run autopep8.
484
0.200.1393 by Jelmer Vernooij
Implement removal of remote branches.
485
        def get_changed_refs(old_refs):
7240.3.1 by Jelmer Vernooij
When sending refs to a remote server, don't send a copy of the old refs.
486
            ret = {}
7240.3.2 by Jelmer Vernooij
Fix tests.
487
            if refname not in old_refs:
0.200.1395 by Jelmer Vernooij
Fix error reporting.
488
                raise NotBranchError(self.user_url)
0.377.1 by Jelmer Vernooij
Fix some remote operations and add more tests.
489
            ret[refname] = dulwich.client.ZERO_SHA
0.200.1393 by Jelmer Vernooij
Implement removal of remote branches.
490
            return ret
7143.15.2 by Jelmer Vernooij
Run autopep8.
491
0.377.1 by Jelmer Vernooij
Fix some remote operations and add more tests.
492
        def generate_pack_data(have, want, ofs_delta=False):
493
            return pack_objects_to_data([])
494
        self.send_pack(get_changed_refs, generate_pack_data)
0.200.1393 by Jelmer Vernooij
Implement removal of remote branches.
495
0.200.1068 by Jelmer Vernooij
Implement user_url/control_url.
496
    @property
497
    def user_url(self):
498
        return self.control_url
499
0.200.1314 by Jelmer Vernooij
Provide RemoteGitDir.user_transport.
500
    @property
501
    def user_transport(self):
502
        return self.root_transport
503
0.200.1395 by Jelmer Vernooij
Fix error reporting.
504
    @property
505
    def control_url(self):
506
        return self.control_transport.base
507
508
    @property
509
    def control_transport(self):
510
        return self.root_transport
511
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
512
    def open_repository(self):
0.200.1415 by Jelmer Vernooij
Fix lock files for remote directories.
513
        return RemoteGitRepository(self)
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
514
7142.3.1 by Jelmer Vernooij
Support .nick on remote branches and fix get_branch_reference.
515
    def get_branch_reference(self, name=None):
516
        ref = branch_name_to_ref(name)
517
        val = self.get_refs_container().read_ref(ref)
518
        if val.startswith(SYMREF):
519
            return val[len(SYMREF):]
520
        return None
521
0.200.1310 by Jelmer Vernooij
Add _get_selected_ref method.
522
    def open_branch(self, name=None, unsupported=False,
7143.15.2 by Jelmer Vernooij
Run autopep8.
523
                    ignore_fallbacks=False, ref=None, possible_transports=None,
524
                    nascent_ok=False):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
525
        repo = self.open_repository()
0.382.1 by Jelmer Vernooij
Various fixes for annotated tags and symrefs.
526
        ref = self._get_selected_ref(name, ref)
7143.2.1 by Jelmer Vernooij
Don't hardcode the list of supported archive formats.
527
        try:
528
            if not nascent_ok and ref not in self.get_refs_container():
7143.16.10 by Jelmer Vernooij
Fix E128.
529
                raise NotBranchError(
530
                    self.root_transport.base, controldir=self)
7143.2.1 by Jelmer Vernooij
Don't hardcode the list of supported archive formats.
531
        except NotGitRepository:
0.382.1 by Jelmer Vernooij
Various fixes for annotated tags and symrefs.
532
            raise NotBranchError(self.root_transport.base,
7143.15.2 by Jelmer Vernooij
Run autopep8.
533
                                 controldir=self)
0.382.1 by Jelmer Vernooij
Various fixes for annotated tags and symrefs.
534
        ref_chain, unused_sha = self.get_refs_container().follow(ref)
535
        return RemoteGitBranch(self, repo, ref_chain[-1])
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
536
0.200.662 by Jelmer Vernooij
Deal with recommend_upgrade argument to open_workingtree.
537
    def open_workingtree(self, recommend_upgrade=False):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
538
        raise NotLocalUrl(self.transport.base)
539
0.310.4 by Jelmer Vernooij
Implement RemoteControlDir.has_workingtree.
540
    def has_workingtree(self):
541
        return False
542
0.200.1489 by Jelmer Vernooij
More fixes to peel handling.
543
    def get_peeled(self, name):
544
        return self.get_refs_container().get_peeled(name)
545
0.200.1487 by Jelmer Vernooij
Use peeling.
546
    def get_refs_container(self):
0.200.1434 by Jelmer Vernooij
Move refs access to control dir.
547
        if self._refs is not None:
548
            return self._refs
0.382.1 by Jelmer Vernooij
Various fixes for annotated tags and symrefs.
549
        result = self.fetch_pack(lambda x: None, None,
7143.15.3 by Jelmer Vernooij
Fix pep8 issues in breezy.git.
550
                                 lambda x: None,
551
                                 lambda x: trace.mutter("git: %s" % x))
0.382.1 by Jelmer Vernooij
Various fixes for annotated tags and symrefs.
552
        self._refs = remote_refs_dict_to_container(
7143.15.2 by Jelmer Vernooij
Run autopep8.
553
            result.refs, result.symrefs)
0.200.1434 by Jelmer Vernooij
Move refs access to control dir.
554
        return self._refs
555
0.401.4 by Jelmer Vernooij
Implement RemoteGitDir.push_branch.
556
    def push_branch(self, source, revision_id=None, overwrite=False,
557
                    remember=False, create_prefix=False, lossy=False,
7490.4.1 by Jelmer Vernooij
Add tag_selector support in GitRemoteDir.
558
                    name=None, tag_selector=None):
0.401.4 by Jelmer Vernooij
Implement RemoteGitDir.push_branch.
559
        """Push the source branch into this ControlDir."""
560
        if revision_id is None:
561
            # No revision supplied by the user, default to the branch
562
            # revision
563
            revision_id = source.last_revision()
564
0.406.1 by Jelmer Vernooij
Properly lookup revnos for brz-git push result.
565
        push_result = GitPushResult()
0.401.4 by Jelmer Vernooij
Implement RemoteGitDir.push_branch.
566
        push_result.workingtree_updated = None
567
        push_result.master_branch = None
568
        push_result.source_branch = source
569
        push_result.stacked_on = None
570
        push_result.branch_push_result = None
571
        repo = self.find_repository()
572
        refname = self._get_selected_ref(name)
7484.1.1 by Jelmer Vernooij
Follow symrefs when pushing to git repositories.
573
        ref_chain, old_sha = self.get_refs_container().follow(refname)
574
        if ref_chain:
575
            actual_refname = ref_chain[-1]
576
        else:
577
            actual_refname = refname
0.407.1 by Jelmer Vernooij
Improve progress reporting.
578
        if isinstance(source, GitBranch) and lossy:
579
            raise errors.LossyPushToSameVCS(source.controldir, self)
0.401.4 by Jelmer Vernooij
Implement RemoteGitDir.push_branch.
580
        source_store = get_object_store(source.repository)
7289.1.2 by Jelmer Vernooij
Fix pushing of tags as part of nascent git branches.
581
        fetch_tags = source.get_config_stack().get('branch.fetch_tags')
7484.1.1 by Jelmer Vernooij
Follow symrefs when pushing to git repositories.
582
        def get_changed_refs(remote_refs):
7484.1.2 by Jelmer Vernooij
Add some tests.
583
            if self._refs is not None:
584
                update_refs_container(self._refs, remote_refs)
7289.1.2 by Jelmer Vernooij
Fix pushing of tags as part of nascent git branches.
585
            ret = {}
586
            # TODO(jelmer): Unpeel if necessary
587
            push_result.new_original_revid = revision_id
588
            if lossy:
589
                new_sha = source_store._lookup_revision_sha1(revision_id)
590
            else:
591
                try:
592
                    new_sha = repo.lookup_bzr_revision_id(revision_id)[0]
593
                except errors.NoSuchRevision:
594
                    raise errors.NoRoundtrippingSupport(
595
                        source, self.open_branch(name=name, nascent_ok=True))
596
            if not overwrite:
7484.1.1 by Jelmer Vernooij
Follow symrefs when pushing to git repositories.
597
                if remote_divergence(old_sha, new_sha, source_store):
7289.1.2 by Jelmer Vernooij
Fix pushing of tags as part of nascent git branches.
598
                    raise DivergedBranches(
599
                        source, self.open_branch(name, nascent_ok=True))
7484.1.1 by Jelmer Vernooij
Follow symrefs when pushing to git repositories.
600
            ret[actual_refname] = new_sha
7289.1.2 by Jelmer Vernooij
Fix pushing of tags as part of nascent git branches.
601
            if fetch_tags:
7289.1.5 by Jelmer Vernooij
Fix flake8 warning.
602
                for tagname, revid in viewitems(source.tags.get_tag_dict()):
7490.4.1 by Jelmer Vernooij
Add tag_selector support in GitRemoteDir.
603
                    if tag_selector and not tag_selector(tagname):
604
                        continue
7289.1.2 by Jelmer Vernooij
Fix pushing of tags as part of nascent git branches.
605
                    if lossy:
7489.1.1 by Jelmer Vernooij
Ignore ghost tags when pushing to a remote git repo.
606
                        try:
607
                            new_sha = source_store._lookup_revision_sha1(revid)
608
                        except KeyError:
609
                            if source.repository.has_revision(revid):
610
                                raise
7289.1.2 by Jelmer Vernooij
Fix pushing of tags as part of nascent git branches.
611
                    else:
612
                        try:
613
                            new_sha = repo.lookup_bzr_revision_id(revid)[0]
614
                        except errors.NoSuchRevision:
615
                            continue
7289.1.5 by Jelmer Vernooij
Fix flake8 warning.
616
                    ret[tag_name_to_ref(tagname)] = new_sha
7289.1.2 by Jelmer Vernooij
Fix pushing of tags as part of nascent git branches.
617
            return ret
0.403.3 by Jelmer Vernooij
Test RemoteGitDir.push_branch.
618
        with source_store.lock_read():
7490.26.2 by Jelmer Vernooij
More shallow work.
619
            def generate_pack_data(have, want, progress=None,
620
                                   ofs_delta=True):
621
                git_repo = getattr(source.repository, '_git', None)
622
                if git_repo:
623
                    shallow = git_repo.get_shallow()
624
                else:
625
                    shallow = None
626
                if lossy:
627
                    return source_store.generate_lossy_pack_data(
628
                        have, want, shallow=shallow,
629
                        progress=progress, ofs_delta=ofs_delta)
630
                elif shallow:
631
                    return source_store.generate_pack_data(
632
                        have, want, shallow=shallow,
633
                        progress=progress, ofs_delta=ofs_delta)
634
                else:
635
                    return source_store.generate_pack_data(
636
                        have, want, progress=progress, ofs_delta=ofs_delta)
0.403.3 by Jelmer Vernooij
Test RemoteGitDir.push_branch.
637
            new_refs = self.send_pack(get_changed_refs, generate_pack_data)
0.401.4 by Jelmer Vernooij
Implement RemoteGitDir.push_branch.
638
        push_result.new_revid = repo.lookup_foreign_revision_id(
7484.1.1 by Jelmer Vernooij
Follow symrefs when pushing to git repositories.
639
            new_refs[actual_refname])
7484.1.2 by Jelmer Vernooij
Add some tests.
640
        if old_sha is not None:
641
            push_result.old_revid = repo.lookup_foreign_revision_id(old_sha)
642
        else:
643
            push_result.old_revid = NULL_REVISION
644
        if self._refs is not None:
645
            update_refs_container(self._refs, new_refs)
0.401.4 by Jelmer Vernooij
Implement RemoteGitDir.push_branch.
646
        push_result.target_branch = self.open_branch(name)
7484.1.2 by Jelmer Vernooij
Add some tests.
647
        if old_sha is not None:
0.403.3 by Jelmer Vernooij
Test RemoteGitDir.push_branch.
648
            push_result.branch_push_result = GitBranchPushResult()
649
            push_result.branch_push_result.source_branch = source
7143.15.3 by Jelmer Vernooij
Fix pep8 issues in breezy.git.
650
            push_result.branch_push_result.target_branch = (
651
                push_result.target_branch)
0.403.3 by Jelmer Vernooij
Test RemoteGitDir.push_branch.
652
            push_result.branch_push_result.local_branch = None
7143.15.3 by Jelmer Vernooij
Fix pep8 issues in breezy.git.
653
            push_result.branch_push_result.master_branch = (
654
                push_result.target_branch)
0.403.3 by Jelmer Vernooij
Test RemoteGitDir.push_branch.
655
            push_result.branch_push_result.old_revid = push_result.old_revid
656
            push_result.branch_push_result.new_revid = push_result.new_revid
7143.15.3 by Jelmer Vernooij
Fix pep8 issues in breezy.git.
657
            push_result.branch_push_result.new_original_revid = (
658
                push_result.new_original_revid)
0.401.4 by Jelmer Vernooij
Implement RemoteGitDir.push_branch.
659
        if source.get_push_location() is None or remember:
660
            source.set_push_location(push_result.target_branch.base)
661
        return push_result
662
0.409.1 by Jelmer Vernooij
Don't probe for commondir over remote transport.
663
    def _find_commondir(self):
664
        # There is no way to find the commondir, if there is any.
665
        return self
666
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
667
0.225.2 by Jelmer Vernooij
Handle situation when repository is already up to date during pull.
668
class EmptyObjectStoreIterator(dict):
669
670
    def iterobjects(self):
671
        return []
672
673
0.200.218 by Jelmer Vernooij
Simplify TemporaryPack implementation.
674
class TemporaryPackIterator(Pack):
675
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
676
    def __init__(self, path, resolve_ext_ref):
0.279.1 by William Grant
Support thin packs in fetch_pack and send_pack, since dulwich now handles them properly.
677
        super(TemporaryPackIterator, self).__init__(
678
            path, resolve_ext_ref=resolve_ext_ref)
0.278.2 by William Grant
Also override _idx_load rather than index, to be a bit cleaner.
679
        self._idx_load = lambda: self._idx_load_or_generate(self._idx_path)
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
680
0.278.2 by William Grant
Also override _idx_load rather than index, to be a bit cleaner.
681
    def _idx_load_or_generate(self, path):
682
        if not os.path.exists(path):
7143.22.2 by Jelmer Vernooij
use more context libs for progress bars.
683
            with ui.ui_factory.nested_progress_bar() as pb:
0.278.2 by William Grant
Also override _idx_load rather than index, to be a bit cleaner.
684
                def report_progress(cur, total):
685
                    pb.update("generating index", cur, total)
7143.22.3 by Jelmer Vernooij
merge trunk.
686
                self.data.create_index(path, progress=report_progress)
0.278.2 by William Grant
Also override _idx_load rather than index, to be a bit cleaner.
687
        return load_pack_index(path)
0.200.205 by Jelmer Vernooij
Fix remote fetching.
688
689
    def __del__(self):
0.200.611 by Jelmer Vernooij
Merge warning fix from Naoki.
690
        if self._idx is not None:
0.241.1 by Naoki INADA
Fix can't delete tempfile on Windows
691
            self._idx.close()
692
            os.remove(self._idx_path)
0.200.611 by Jelmer Vernooij
Merge warning fix from Naoki.
693
        if self._data is not None:
0.241.1 by Naoki INADA
Fix can't delete tempfile on Windows
694
            self._data.close()
695
            os.remove(self._data_path)
0.200.205 by Jelmer Vernooij
Fix remote fetching.
696
697
0.200.1337 by Jelmer Vernooij
Re-use http connection if possible.
698
class BzrGitHttpClient(dulwich.client.HttpGitClient):
699
700
    def __init__(self, transport, *args, **kwargs):
701
        self.transport = transport
7268.10.2 by Jelmer Vernooij
Strip username.
702
        url = urlutils.URL.from_string(transport.external_url())
703
        url.user = url.quoted_user = None
704
        url.password = url.quoted_password = None
7441.1.1 by Jelmer Vernooij
Add strip_segment_parameters function.
705
        url = urlutils.strip_segment_parameters(str(url))
7371.3.2 by Jelmer Vernooij
Fix URL parsing for Git.
706
        super(BzrGitHttpClient, self).__init__(url, *args, **kwargs)
0.409.2 by Jelmer Vernooij
call out to HTTP transport rather than creating new connection.
707
708
    def _http_request(self, url, headers=None, data=None,
709
                      allow_compression=False):
710
        """Perform HTTP request.
711
712
        :param url: Request URL.
713
        :param headers: Optional custom headers to override defaults.
714
        :param data: Request data.
715
        :param allow_compression: Allow GZipped communication.
716
        :return: Tuple (`response`, `read`), where response is an `urllib3`
7140.1.1 by Jelmer Vernooij
Rollback https://code.launchpad.net/~jelmer/brz/python3-git-fix-http/+merge/356238
717
            response object with additional `content_type` and
718
            `redirect_location` properties, and `read` is a consumable read
719
            method for the response data.
0.409.2 by Jelmer Vernooij
call out to HTTP transport rather than creating new connection.
720
        """
7359.1.1 by Jelmer Vernooij
Only set user agent for GitHub.
721
        if is_github_url(url):
722
            headers['User-agent'] = user_agent_for_github()
0.409.2 by Jelmer Vernooij
call out to HTTP transport rather than creating new connection.
723
        headers["Pragma"] = "no-cache"
724
        if allow_compression:
725
            headers["Accept-Encoding"] = "gzip"
726
        else:
727
            headers["Accept-Encoding"] = "identity"
728
7296.2.2 by Jelmer Vernooij
Add a urllib3-like interface.
729
        response = self.transport.request(
0.409.2 by Jelmer Vernooij
call out to HTTP transport rather than creating new connection.
730
            ('GET' if data is None else 'POST'),
7320.1.1 by Jelmer Vernooij
Fix git http support.
731
            url,
7296.2.2 by Jelmer Vernooij
Add a urllib3-like interface.
732
            body=data,
733
            headers=headers, retries=8)
734
735
        if response.status == 404:
0.409.2 by Jelmer Vernooij
call out to HTTP transport rather than creating new connection.
736
            raise NotGitRepository()
7296.2.2 by Jelmer Vernooij
Add a urllib3-like interface.
737
        elif response.status != 200:
0.409.2 by Jelmer Vernooij
call out to HTTP transport rather than creating new connection.
738
            raise GitProtocolError("unexpected http resp %d for %s" %
7490.14.1 by Jelmer Vernooij
Various git fixes.
739
                                   (response.status, url))
0.409.2 by Jelmer Vernooij
call out to HTTP transport rather than creating new connection.
740
741
        # TODO: Optimization available by adding `preload_content=False` to the
742
        # request and just passing the `read` method on instead of going via
743
        # `BytesIO`, if we can guarantee that the entire response is consumed
744
        # before issuing the next to still allow for connection reuse from the
745
        # pool.
746
        if response.getheader("Content-Encoding") == "gzip":
7404.5.3 by Jelmer Vernooij
Reuse connections.
747
            read = gzip.GzipFile(fileobj=BytesIO(response.read())).read
0.409.2 by Jelmer Vernooij
call out to HTTP transport rather than creating new connection.
748
        else:
749
            read = response.read
750
751
        class WrapResponse(object):
752
753
            def __init__(self, response):
754
                self._response = response
7320.1.1 by Jelmer Vernooij
Fix git http support.
755
                self.status = response.status
0.409.2 by Jelmer Vernooij
call out to HTTP transport rather than creating new connection.
756
                self.content_type = response.getheader("Content-Type")
7320.1.1 by Jelmer Vernooij
Fix git http support.
757
                self.redirect_location = response._actual.geturl()
0.409.2 by Jelmer Vernooij
call out to HTTP transport rather than creating new connection.
758
7143.2.1 by Jelmer Vernooij
Don't hardcode the list of supported archive formats.
759
            def readlines(self):
760
                return self._response.readlines()
761
0.409.2 by Jelmer Vernooij
call out to HTTP transport rather than creating new connection.
762
            def close(self):
7320.1.1 by Jelmer Vernooij
Fix git http support.
763
                pass
0.409.2 by Jelmer Vernooij
call out to HTTP transport rather than creating new connection.
764
765
        return WrapResponse(response), read
0.200.1337 by Jelmer Vernooij
Re-use http connection if possible.
766
767
7371.3.2 by Jelmer Vernooij
Fix URL parsing for Git.
768
def _git_url_and_path_from_transport(external_url):
7441.1.1 by Jelmer Vernooij
Add strip_segment_parameters function.
769
    url = urlutils.strip_segment_parameters(external_url)
7371.3.2 by Jelmer Vernooij
Fix URL parsing for Git.
770
    return urlparse.urlsplit(url)
771
772
0.200.1137 by Jelmer Vernooij
Support BzrProber.known_formats().
773
class RemoteGitControlDirFormat(GitControlDirFormat):
774
    """The .git directory control format."""
775
776
    supports_workingtrees = False
777
778
    @classmethod
779
    def _known_formats(self):
780
        return set([RemoteGitControlDirFormat()])
781
0.295.1 by Jelmer Vernooij
Split up branch formats.
782
    def get_branch_format(self):
783
        return RemoteGitBranchFormat()
784
7290.20.3 by Jelmer Vernooij
Fix tests for git/full history branches.
785
    @property
786
    def repository_format(self):
787
        return GitRepositoryFormat()
788
0.200.1413 by Jelmer Vernooij
Fix is_initializable()
789
    def is_initializable(self):
790
        return False
791
792
    def is_supported(self):
793
        return True
794
0.200.1137 by Jelmer Vernooij
Support BzrProber.known_formats().
795
    def open(self, transport, _found=None):
796
        """Open this directory.
797
798
        """
7371.3.2 by Jelmer Vernooij
Fix URL parsing for Git.
799
        split_url = _git_url_and_path_from_transport(transport.external_url())
0.200.1336 by Jelmer Vernooij
Support the git smart server http protocol.
800
        if isinstance(transport, GitSmartTransport):
0.344.1 by Jelmer Vernooij
Allow using local git executable by accessing git:///some/path.
801
            client = transport._get_client()
7371.3.2 by Jelmer Vernooij
Fix URL parsing for Git.
802
        elif split_url.scheme in ("http", "https"):
0.344.1 by Jelmer Vernooij
Allow using local git executable by accessing git:///some/path.
803
            client = BzrGitHttpClient(transport)
7380.1.1 by Jelmer Vernooij
Several more fixes for git merge proposals.
804
        elif split_url.scheme in ('file', ):
0.344.1 by Jelmer Vernooij
Allow using local git executable by accessing git:///some/path.
805
            client = dulwich.client.LocalGitClient()
0.200.1336 by Jelmer Vernooij
Support the git smart server http protocol.
806
        else:
0.200.1137 by Jelmer Vernooij
Support BzrProber.known_formats().
807
            raise NotBranchError(transport.base)
0.344.1 by Jelmer Vernooij
Allow using local git executable by accessing git:///some/path.
808
        if not _found:
7143.15.2 by Jelmer Vernooij
Run autopep8.
809
            pass  # TODO(jelmer): Actually probe for something
7371.3.2 by Jelmer Vernooij
Fix URL parsing for Git.
810
        return RemoteGitDir(transport, self, client, split_url.path)
0.200.1137 by Jelmer Vernooij
Support BzrProber.known_formats().
811
812
    def get_format_description(self):
813
        return "Remote Git Repository"
814
815
    def initialize_on_transport(self, transport):
816
        raise UninitializableFormat(self)
817
0.200.1412 by Jelmer Vernooij
Implement GitControlDirFormat.supports_transport.
818
    def supports_transport(self, transport):
819
        try:
820
            external_url = transport.external_url()
821
        except InProcessTransport:
822
            raise NotBranchError(path=transport.base)
7143.15.2 by Jelmer Vernooij
Run autopep8.
823
        return (external_url.startswith("http:")
824
                or external_url.startswith("https:")
825
                or external_url.startswith("git+")
826
                or external_url.startswith("git:"))
0.200.1412 by Jelmer Vernooij
Implement GitControlDirFormat.supports_transport.
827
0.200.1137 by Jelmer Vernooij
Support BzrProber.known_formats().
828
6968.4.1 by Jelmer Vernooij
Add support for exporting archives in Git.
829
class GitRemoteRevisionTree(RevisionTree):
830
6968.4.4 by Jelmer Vernooij
Update for API changes from archive branch.
831
    def archive(self, format, name, root=None, subdir=None, force_mtime=None):
6968.4.1 by Jelmer Vernooij
Add support for exporting archives in Git.
832
        """Create an archive of this tree.
833
6968.4.4 by Jelmer Vernooij
Update for API changes from archive branch.
834
        :param format: Format name (e.g. 'tar')
6968.4.1 by Jelmer Vernooij
Add support for exporting archives in Git.
835
        :param name: target file name
836
        :param root: Root directory name (or None)
837
        :param subdir: Subdirectory to export (or None)
838
        :return: Iterator over archive chunks
839
        """
840
        commit = self._repository.lookup_bzr_revision_id(
841
            self.get_revision_id())[0]
6968.4.4 by Jelmer Vernooij
Update for API changes from archive branch.
842
        f = tempfile.SpooledTemporaryFile()
843
        # git-upload-archive(1) generaly only supports refs. So let's see if we
844
        # can find one.
6968.4.1 by Jelmer Vernooij
Add support for exporting archives in Git.
845
        reverse_refs = {
7143.15.2 by Jelmer Vernooij
Run autopep8.
846
            v: k for (k, v) in
847
            self._repository.controldir.get_refs_container().as_dict().items()}
6968.4.4 by Jelmer Vernooij
Update for API changes from archive branch.
848
        try:
849
            committish = reverse_refs[commit]
850
        except KeyError:
851
            # No? Maybe the user has uploadArchive.allowUnreachable enabled.
852
            # Let's hope for the best.
853
            committish = commit
6968.4.1 by Jelmer Vernooij
Add support for exporting archives in Git.
854
        self._repository.archive(
7143.15.2 by Jelmer Vernooij
Run autopep8.
855
            format, committish, f.write,
856
            subdirs=([subdir] if subdir else None),
857
            prefix=(root + '/') if root else '')
6968.4.1 by Jelmer Vernooij
Add support for exporting archives in Git.
858
        f.seek(0)
6968.4.4 by Jelmer Vernooij
Update for API changes from archive branch.
859
        return osutils.file_iterator(f)
6968.4.1 by Jelmer Vernooij
Add support for exporting archives in Git.
860
7192.5.1 by Jelmer Vernooij
Remove more file ids.
861
    def is_versioned(self, path):
7143.2.1 by Jelmer Vernooij
Don't hardcode the list of supported archive formats.
862
        raise GitSmartRemoteNotSupported(self.is_versioned, self)
863
864
    def has_filename(self, path):
865
        raise GitSmartRemoteNotSupported(self.has_filename, self)
866
7192.5.1 by Jelmer Vernooij
Remove more file ids.
867
    def get_file_text(self, path):
7143.2.1 by Jelmer Vernooij
Don't hardcode the list of supported archive formats.
868
        raise GitSmartRemoteNotSupported(self.get_file_text, self)
869
7413.4.4 by Jelmer Vernooij
'Implement' RevisionTree.list_files.
870
    def list_files(self, include_root=False, from_dir=None, recursive=True):
871
        raise GitSmartRemoteNotSupported(self.list_files, self)
872
6968.4.1 by Jelmer Vernooij
Add support for exporting archives in Git.
873
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
874
class RemoteGitRepository(GitRepository):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
875
7254.5.1 by Jelmer Vernooij
Add supports_random_access attribute to repositories.
876
    supports_random_access = False
877
0.200.319 by Jelmer Vernooij
Print proper error when trying unsupported operations against a git server.
878
    @property
0.200.1068 by Jelmer Vernooij
Implement user_url/control_url.
879
    def user_url(self):
880
        return self.control_url
881
0.200.1288 by Jelmer Vernooij
Properly raise GitRemoteNotSupported from RemoteGitRepository.
882
    def get_parent_map(self, revids):
0.200.1398 by Jelmer Vernooij
Make GitSmartRemoteNotSupported derive from UnsupportedOperation.
883
        raise GitSmartRemoteNotSupported(self.get_parent_map, self)
0.200.319 by Jelmer Vernooij
Print proper error when trying unsupported operations against a git server.
884
6968.4.1 by Jelmer Vernooij
Add support for exporting archives in Git.
885
    def archive(self, *args, **kwargs):
886
        return self.controldir.archive(*args, **kwargs)
887
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
888
    def fetch_pack(self, determine_wants, graph_walker, pack_data,
0.200.155 by Jelmer Vernooij
Fix formatting, remove catch-all for exceptions when opening local repositories.
889
                   progress=None):
7143.2.1 by Jelmer Vernooij
Don't hardcode the list of supported archive formats.
890
        return self.controldir.fetch_pack(
7143.16.8 by Jelmer Vernooij
Fix E126
891
            determine_wants, graph_walker, pack_data, progress)
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
892
0.377.1 by Jelmer Vernooij
Fix some remote operations and add more tests.
893
    def send_pack(self, get_changed_refs, generate_pack_data):
894
        return self.controldir.send_pack(get_changed_refs, generate_pack_data)
0.200.427 by Jelmer Vernooij
make send_pack accessible.
895
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
896
    def fetch_objects(self, determine_wants, graph_walker, resolve_ext_ref,
897
                      progress=None):
0.200.167 by Jelmer Vernooij
Implement fetch_objects properly.
898
        fd, path = tempfile.mkstemp(suffix=".pack")
0.200.1299 by Jelmer Vernooij
Make sure file gets closed.
899
        try:
900
            self.fetch_pack(determine_wants, graph_walker,
7143.15.2 by Jelmer Vernooij
Run autopep8.
901
                            lambda x: os.write(fd, x), progress)
0.200.1299 by Jelmer Vernooij
Make sure file gets closed.
902
        finally:
903
            os.close(fd)
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
904
        if os.path.getsize(path) == 0:
0.225.2 by Jelmer Vernooij
Handle situation when repository is already up to date during pull.
905
            return EmptyObjectStoreIterator()
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
906
        return TemporaryPackIterator(path[:-len(".pack")], resolve_ext_ref)
0.200.167 by Jelmer Vernooij
Implement fetch_objects properly.
907
0.377.1 by Jelmer Vernooij
Fix some remote operations and add more tests.
908
    def lookup_bzr_revision_id(self, bzr_revid, mapping=None):
7143.15.3 by Jelmer Vernooij
Fix pep8 issues in breezy.git.
909
        # This won't work for any round-tripped bzr revisions, but it's a
910
        # start..
0.200.415 by Jelmer Vernooij
make 'bzr pull --revision' work for remote repositories.
911
        try:
912
            return mapping_registry.revision_id_bzr_to_foreign(bzr_revid)
913
        except InvalidRevisionId:
914
            raise NoSuchRevision(self, bzr_revid)
915
0.252.48 by Jelmer Vernooij
Implement lookup_foreign_revision for remote branches.
916
    def lookup_foreign_revision_id(self, foreign_revid, mapping=None):
917
        """Lookup a revision id.
918
919
        """
920
        if mapping is None:
921
            mapping = self.get_mapping()
922
        # Not really an easy way to parse foreign revids here..
923
        return mapping.revision_id_foreign_to_bzr(foreign_revid)
924
0.200.1446 by Jelmer Vernooij
Add stub for RemoteGitRepository.revision_tree.
925
    def revision_tree(self, revid):
6968.4.1 by Jelmer Vernooij
Add support for exporting archives in Git.
926
        return GitRemoteRevisionTree(self, revid)
0.200.1446 by Jelmer Vernooij
Add stub for RemoteGitRepository.revision_tree.
927
0.200.1481 by Jelmer Vernooij
'Implement' RemoteGitRepository.get_revisions.
928
    def get_revisions(self, revids):
929
        raise GitSmartRemoteNotSupported(self.get_revisions, self)
930
0.200.1557 by Jelmer Vernooij
Implement RemoteGitRepository.has_revisions.
931
    def has_revisions(self, revids):
932
        raise GitSmartRemoteNotSupported(self.get_revisions, self)
933
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
934
0.200.1064 by Jelmer Vernooij
Use common base class for tags.
935
class RemoteGitTagDict(GitTags):
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
936
937
    def set_tag(self, name, revid):
0.377.1 by Jelmer Vernooij
Fix some remote operations and add more tests.
938
        sha = self.branch.lookup_bzr_revision_id(revid)[0]
939
        self._set_ref(name, sha)
940
941
    def delete_tag(self, name):
942
        self._set_ref(name, dulwich.client.ZERO_SHA)
943
944
    def _set_ref(self, name, sha):
945
        ref = tag_name_to_ref(name)
7143.15.2 by Jelmer Vernooij
Run autopep8.
946
0.377.1 by Jelmer Vernooij
Fix some remote operations and add more tests.
947
        def get_changed_refs(old_refs):
7240.3.1 by Jelmer Vernooij
When sending refs to a remote server, don't send a copy of the old refs.
948
            ret = {}
7240.3.2 by Jelmer Vernooij
Fix tests.
949
            if sha == dulwich.client.ZERO_SHA and ref not in old_refs:
0.377.1 by Jelmer Vernooij
Fix some remote operations and add more tests.
950
                raise NoSuchTag(name)
951
            ret[ref] = sha
952
            return ret
7143.15.2 by Jelmer Vernooij
Run autopep8.
953
0.377.1 by Jelmer Vernooij
Fix some remote operations and add more tests.
954
        def generate_pack_data(have, want, ofs_delta=False):
955
            return pack_objects_to_data([])
956
        self.repository.send_pack(get_changed_refs, generate_pack_data)
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
957
958
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
959
class RemoteGitBranch(GitBranch):
960
0.200.1648 by Jelmer Vernooij
Fix compatibility with newer versions of breezy.
961
    def __init__(self, controldir, repository, name):
0.200.919 by Jelmer Vernooij
Simplify ref handling in remote.py.
962
        self._sha = None
0.295.1 by Jelmer Vernooij
Split up branch formats.
963
        super(RemoteGitBranch, self).__init__(controldir, repository, name,
7143.15.2 by Jelmer Vernooij
Run autopep8.
964
                                              RemoteGitBranchFormat())
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
965
0.200.1317 by Jelmer Vernooij
Avoid NotImplementedError.
966
    def last_revision_info(self):
0.200.1398 by Jelmer Vernooij
Make GitSmartRemoteNotSupported derive from UnsupportedOperation.
967
        raise GitSmartRemoteNotSupported(self.last_revision_info, self)
0.200.1317 by Jelmer Vernooij
Avoid NotImplementedError.
968
0.200.1068 by Jelmer Vernooij
Implement user_url/control_url.
969
    @property
970
    def user_url(self):
971
        return self.control_url
972
973
    @property
974
    def control_url(self):
975
        return self.base
976
0.200.1436 by Jelmer Vernooij
Raise UnsupportedOperation for `Branch.revision_id_to_dotted_revno`,
977
    def revision_id_to_revno(self, revision_id):
978
        raise GitSmartRemoteNotSupported(self.revision_id_to_revno, self)
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
979
980
    def last_revision(self):
0.252.44 by Jelmer Vernooij
Properly look up Bazaar revision ids for revision parents in case they are round-tripped.
981
        return self.lookup_foreign_revision_id(self.head)
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
982
983
    @property
984
    def head(self):
0.200.919 by Jelmer Vernooij
Simplify ref handling in remote.py.
985
        if self._sha is not None:
986
            return self._sha
0.200.1648 by Jelmer Vernooij
Fix compatibility with newer versions of breezy.
987
        refs = self.controldir.get_refs_container()
0.200.1561 by Jelmer Vernooij
Some fixes for colocated branch handling.
988
        name = branch_name_to_ref(self.name)
0.200.1386 by Jelmer Vernooij
Friendlier message if HEAD is not found.
989
        try:
990
            self._sha = refs[name]
991
        except KeyError:
992
            raise NoSuchRef(name, self.repository.user_url, refs)
0.200.919 by Jelmer Vernooij
Simplify ref handling in remote.py.
993
        return self._sha
0.200.141 by Jelmer Vernooij
Separate out local and remote fetching.
994
0.200.169 by Jelmer Vernooij
Fix branch cloning.
995
    def _synchronize_history(self, destination, revision_id):
996
        """See Branch._synchronize_history()."""
7143.12.1 by Jelmer Vernooij
Support cloning revisions referenced only by an annotated tag.
997
        if revision_id is None:
998
            revision_id = self.last_revision()
999
        destination.generate_revision_history(revision_id)
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
1000
0.289.1 by Jelmer Vernooij
No parent location for remote repos.
1001
    def _get_parent_location(self):
1002
        return None
1003
0.200.499 by Jelmer Vernooij
Implement RemoteBranch.{get,set}_push_location.
1004
    def get_push_location(self):
1005
        return None
1006
1007
    def set_push_location(self, url):
1008
        pass
0.200.1488 by Jelmer Vernooij
Factor out remote_refs_dict_to_container.
1009
0.375.1 by Jelmer Vernooij
Fix remote tests, warn when fetching git->bzr and bzr->git.
1010
    def _iter_tag_refs(self):
1011
        """Iterate over the tag refs.
1012
1013
        :param refs: Refs dictionary (name -> git sha1)
1014
        :return: iterator over (ref_name, tag_name, peeled_sha1, unpeeled_sha1)
1015
        """
1016
        refs = self.controldir.get_refs_container()
6964.2.1 by Jelmer Vernooij
Initial work to support brz-git on python3.
1017
        for ref_name, unpeeled in refs.as_dict().items():
0.375.1 by Jelmer Vernooij
Fix remote tests, warn when fetching git->bzr and bzr->git.
1018
            try:
1019
                tag_name = ref_to_tag_name(ref_name)
1020
            except (ValueError, UnicodeDecodeError):
1021
                continue
1022
            peeled = refs.get_peeled(ref_name)
1023
            if peeled is None:
7058.4.36 by Jelmer Vernooij
Fix peeled error.
1024
                # Let's just hope it's a commit
1025
                peeled = unpeeled
6973.6.2 by Jelmer Vernooij
Fix more tests.
1026
            if not isinstance(tag_name, text_type):
0.375.1 by Jelmer Vernooij
Fix remote tests, warn when fetching git->bzr and bzr->git.
1027
                raise TypeError(tag_name)
1028
            yield (ref_name, tag_name, peeled, unpeeled)
1029
7131.12.1 by Jelmer Vernooij
Support uncommit on remote git branches.
1030
    def set_last_revision_info(self, revno, revid):
1031
        self.generate_revision_history(revid)
1032
1033
    def generate_revision_history(self, revision_id, last_rev=None,
1034
                                  other_branch=None):
1035
        sha = self.lookup_bzr_revision_id(revision_id)[0]
1036
        def get_changed_refs(old_refs):
1037
            return {self.ref: sha}
1038
        def generate_pack_data(have, want, ofs_delta=False):
1039
            return pack_objects_to_data([])
1040
        self.repository.send_pack(get_changed_refs, generate_pack_data)
1041
        self._sha = sha
1042
0.200.1488 by Jelmer Vernooij
Factor out remote_refs_dict_to_container.
1043
0.382.1 by Jelmer Vernooij
Various fixes for annotated tags and symrefs.
1044
def remote_refs_dict_to_container(refs_dict, symrefs_dict={}):
0.200.1488 by Jelmer Vernooij
Factor out remote_refs_dict_to_container.
1045
    base = {}
1046
    peeled = {}
6964.2.1 by Jelmer Vernooij
Initial work to support brz-git on python3.
1047
    for k, v in refs_dict.items():
0.200.1488 by Jelmer Vernooij
Factor out remote_refs_dict_to_container.
1048
        if is_peeled(k):
1049
            peeled[k[:-3]] = v
1050
        else:
1051
            base[k] = v
6964.2.1 by Jelmer Vernooij
Initial work to support brz-git on python3.
1052
    for name, target in symrefs_dict.items():
0.382.1 by Jelmer Vernooij
Various fixes for annotated tags and symrefs.
1053
        base[name] = SYMREF + target
0.200.1488 by Jelmer Vernooij
Factor out remote_refs_dict_to_container.
1054
    ret = DictRefsContainer(base)
1055
    ret._peeled = peeled
1056
    return ret
7484.1.1 by Jelmer Vernooij
Follow symrefs when pushing to git repositories.
1057
1058
1059
def update_refs_container(container, refs_dict):
1060
    peeled = {}
1061
    base = {}
1062
    for k, v in refs_dict.items():
1063
        if is_peeled(k):
1064
            peeled[k[:-3]] = v
1065
        else:
1066
            base[k] = v
1067
    container._peeled = peeled
1068
    container._refs.update(base)