/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.200.910 by Jelmer Vernooij
update copyright years
1
# Copyright (C) 2009-2010 Jelmer Vernooij <jelmer@samba.org>
0.200.291 by Jelmer Vernooij
Print proper error about not supporting push.
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
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
17
"""Push implementation that simply prints message saying push is not supported."""
18
0.200.357 by Jelmer Vernooij
Move push code to push.py.
19
from bzrlib import (
0.200.598 by Jelmer Vernooij
Cope with ghosts.
20
    errors,
0.200.357 by Jelmer Vernooij
Move push code to push.py.
21
    ui,
22
    )
0.252.5 by Jelmer Vernooij
enable 'bzr push'.
23
from bzrlib.graph import (
24
    PendingAncestryResult,
25
    )
0.200.291 by Jelmer Vernooij
Print proper error about not supporting push.
26
from bzrlib.repository import (
27
    InterRepository,
28
    )
0.200.371 by Jelmer Vernooij
Add progress bar when determining revisions to dpush
29
from bzrlib.revision import (
30
    NULL_REVISION,
31
    )
0.200.291 by Jelmer Vernooij
Print proper error about not supporting push.
32
33
from bzrlib.plugins.git.errors import (
34
    NoPushSupport,
35
    )
0.200.456 by Jelmer Vernooij
Fix git -> git fetching.
36
from bzrlib.plugins.git.object_store import (
37
    BazaarObjectStore,
38
    )
0.200.291 by Jelmer Vernooij
Print proper error about not supporting push.
39
from bzrlib.plugins.git.repository import (
40
    GitRepository,
0.200.425 by Jelmer Vernooij
Split out push to remote git repositories.
41
    LocalGitRepository,
0.200.291 by Jelmer Vernooij
Print proper error about not supporting push.
42
    GitRepositoryFormat,
43
    )
0.200.425 by Jelmer Vernooij
Split out push to remote git repositories.
44
from bzrlib.plugins.git.remote import (
45
    RemoteGitRepository,
46
    )
0.200.291 by Jelmer Vernooij
Print proper error about not supporting push.
47
0.200.364 by Jelmer Vernooij
Reimplement dpush, but more efficient and only writing a single pack file rather than one per revision.
48
49
class MissingObjectsIterator(object):
50
    """Iterate over git objects that are missing from a target repository.
51
52
    """
53
0.200.525 by Jelmer Vernooij
Simplify push a bit further, make dpush without rebase faster.
54
    def __init__(self, store, source, pb=None):
0.200.364 by Jelmer Vernooij
Reimplement dpush, but more efficient and only writing a single pack file rather than one per revision.
55
        """Create a new missing objects iterator.
56
57
        """
58
        self.source = source
0.200.525 by Jelmer Vernooij
Simplify push a bit further, make dpush without rebase faster.
59
        self._object_store = store
0.200.364 by Jelmer Vernooij
Reimplement dpush, but more efficient and only writing a single pack file rather than one per revision.
60
        self._pending = []
0.200.369 by Jelmer Vernooij
Report on pack objects progress.
61
        self.pb = pb
0.200.364 by Jelmer Vernooij
Reimplement dpush, but more efficient and only writing a single pack file rather than one per revision.
62
0.252.4 by Jelmer Vernooij
More work on roundtripping.
63
    def import_revisions(self, revids, roundtrip):
0.200.947 by Jelmer Vernooij
Add convenience method for getting missing objects iterator.
64
        """Import a set of revisions into this git repository.
65
66
        :param revids: Revision ids of revisions to import
67
        :param roundtrip: Whether to roundtrip bzr metadata
68
        """
0.200.369 by Jelmer Vernooij
Report on pack objects progress.
69
        for i, revid in enumerate(revids):
70
            if self.pb:
71
                self.pb.update("pushing revisions", i, len(revids))
0.252.4 by Jelmer Vernooij
More work on roundtripping.
72
            git_commit = self.import_revision(revid, roundtrip)
0.252.6 by Jelmer Vernooij
Roundtripping support for revision ids works.
73
            yield (revid, git_commit)
0.200.364 by Jelmer Vernooij
Reimplement dpush, but more efficient and only writing a single pack file rather than one per revision.
74
0.252.4 by Jelmer Vernooij
More work on roundtripping.
75
    def import_revision(self, revid, roundtrip):
0.200.947 by Jelmer Vernooij
Add convenience method for getting missing objects iterator.
76
        """Import a revision into this Git repository.
0.200.364 by Jelmer Vernooij
Reimplement dpush, but more efficient and only writing a single pack file rather than one per revision.
77
0.200.947 by Jelmer Vernooij
Add convenience method for getting missing objects iterator.
78
        :param revid: Revision id of the revision
79
        :param roundtrip: Whether to roundtrip bzr metadata
0.200.364 by Jelmer Vernooij
Reimplement dpush, but more efficient and only writing a single pack file rather than one per revision.
80
        """
0.200.852 by Jelmer Vernooij
Cache trees rather than inventories.
81
        tree = self._object_store.tree_cache.revision_tree(revid)
0.200.548 by Jelmer Vernooij
Extract unusual file modes from revision when reconstructing Trees.
82
        rev = self.source.get_revision(revid)
0.200.784 by Jelmer Vernooij
Use common object generation code in push.
83
        commit = None
0.252.4 by Jelmer Vernooij
More work on roundtripping.
84
        for path, obj, ie in self._object_store._revision_to_objects(rev, tree,
85
            roundtrip):
0.200.829 by Jelmer Vernooij
Cope with the fact that _type is gone in upstream dulwich.
86
            if obj.type_name == "commit":
0.200.784 by Jelmer Vernooij
Use common object generation code in push.
87
                commit = obj
0.200.786 by Jelmer Vernooij
Simplify push code.
88
            self._pending.append((obj, path))
0.200.364 by Jelmer Vernooij
Reimplement dpush, but more efficient and only writing a single pack file rather than one per revision.
89
        return commit.id
90
91
    def __len__(self):
92
        return len(self._pending)
93
94
    def __iter__(self):
0.200.786 by Jelmer Vernooij
Simplify push code.
95
        return iter(self._pending)
0.200.364 by Jelmer Vernooij
Reimplement dpush, but more efficient and only writing a single pack file rather than one per revision.
96
97
0.200.291 by Jelmer Vernooij
Print proper error about not supporting push.
98
class InterToGitRepository(InterRepository):
99
    """InterRepository that copies into a Git repository."""
100
101
    _matching_repo_format = GitRepositoryFormat()
102
0.200.435 by Jelmer Vernooij
Remember mapping per InterRepository.
103
    def __init__(self, source, target):
104
        super(InterToGitRepository, self).__init__(source, target)
105
        self.mapping = self.target.get_mapping()
0.200.525 by Jelmer Vernooij
Simplify push a bit further, make dpush without rebase faster.
106
        self.source_store = BazaarObjectStore(self.source, self.mapping)
0.200.435 by Jelmer Vernooij
Remember mapping per InterRepository.
107
0.200.291 by Jelmer Vernooij
Print proper error about not supporting push.
108
    @staticmethod
109
    def _get_repo_format_to_test():
110
        return None
111
112
    def copy_content(self, revision_id=None, pb=None):
113
        """See InterRepository.copy_content."""
114
        self.fetch(revision_id, pb, find_ghosts=False)
115
0.200.943 by Jelmer Vernooij
Add stubs.
116
    def dfetch_refs(self, update_refs):
117
        """Fetch non-roundtripped revisions into the target repository.
118
119
        :param update_refs: Generate refs to fetch. Receives dictionary 
120
            with old names to old git shas. Should return a dictionary
121
            of new names to Bazaar revision ids.
122
        :return: revision id map, old refs dictionary and new refs dictionary
123
        """
124
        raise NotImplementedError(self.dfetch_refs)
125
126
    def fetch_refs(self, update_refs):
127
        """Fetch possibly roundtripped revisions into the target repository.
128
129
        :param update_refs: Generate refs to fetch. Receives dictionary 
130
            with old refs (git shas), returns dictionary of new names to 
131
            git shas.
132
        :return: old refs, new refs
133
        """
134
        raise NotImplementedError(self.fetch_refs)
135
0.200.425 by Jelmer Vernooij
Split out push to remote git repositories.
136
137
class InterToLocalGitRepository(InterToGitRepository):
0.200.966 by Jelmer Vernooij
Some more docstrings.
138
    """InterBranch implementation between a Bazaar and a Git repository."""
0.200.425 by Jelmer Vernooij
Split out push to remote git repositories.
139
0.252.3 by Jelmer Vernooij
Refactor revision finding code.
140
    def __init__(self, source, target):
141
        super(InterToLocalGitRepository, self).__init__(source, target)
142
        self.target_store = self.target._git.object_store
0.252.6 by Jelmer Vernooij
Roundtripping support for revision ids works.
143
        self.target_refs = self.target._git.refs
0.252.3 by Jelmer Vernooij
Refactor revision finding code.
144
0.200.525 by Jelmer Vernooij
Simplify push a bit further, make dpush without rebase faster.
145
    def missing_revisions(self, stop_revisions, check_revid):
0.200.966 by Jelmer Vernooij
Some more docstrings.
146
        """Find the revisions that are missing from the target repository.
147
148
        :param stop_revisions: Revisions to check for
149
        :param check_revid: Convenience function to check if a revid is 
150
            present.
151
        :return: sequence of missing revisions, in topological order
152
        """
0.200.357 by Jelmer Vernooij
Move push code to push.py.
153
        missing = []
0.252.43 by Jelmer Vernooij
Some refactoring, support proper file ids in revision deltas.
154
        graph = self.source.get_graph()
0.200.371 by Jelmer Vernooij
Add progress bar when determining revisions to dpush
155
        pb = ui.ui_factory.nested_progress_bar()
156
        try:
0.200.524 by Jelmer Vernooij
Simplify dpushing multiple heads.
157
            for revid, _ in graph.iter_ancestry(stop_revisions):
0.200.371 by Jelmer Vernooij
Add progress bar when determining revisions to dpush
158
                pb.update("determining revisions to fetch", len(missing))
0.200.525 by Jelmer Vernooij
Simplify push a bit further, make dpush without rebase faster.
159
                if not check_revid(revid):
0.200.371 by Jelmer Vernooij
Add progress bar when determining revisions to dpush
160
                    missing.append(revid)
161
        finally:
162
            pb.finished()
0.252.43 by Jelmer Vernooij
Some refactoring, support proper file ids in revision deltas.
163
        return graph.iter_topo_order(missing)
0.200.357 by Jelmer Vernooij
Move push code to push.py.
164
0.200.941 by Jelmer Vernooij
Pass update_refs argument to fetch_refs.
165
    def fetch_refs(self, update_refs):
166
        old_refs = self.target._git.get_refs()
167
        new_refs = update_refs(old_refs)
168
        fetch_spec = PendingAncestryResult(new_refs.values(), self.source)
0.252.5 by Jelmer Vernooij
enable 'bzr push'.
169
        self.fetch(fetch_spec=fetch_spec)
0.200.941 by Jelmer Vernooij
Pass update_refs argument to fetch_refs.
170
        return old_refs, new_refs
0.252.5 by Jelmer Vernooij
enable 'bzr push'.
171
0.200.942 by Jelmer Vernooij
pass update_refs to dfetch_refs.
172
    def dfetch_refs(self, update_refs):
0.200.822 by Jelmer Vernooij
Fix indication of number of revisions pushed in dpush.
173
        old_refs = self.target._git.get_refs()
0.200.942 by Jelmer Vernooij
pass update_refs to dfetch_refs.
174
        new_refs = update_refs(old_refs)
175
        revidmap, gitidmap = self.dfetch(new_refs.values())
176
        for name, revid in new_refs.iteritems():
0.252.39 by Jelmer Vernooij
Update rather than overwrite refs.
177
            try:
0.200.524 by Jelmer Vernooij
Simplify dpushing multiple heads.
178
                gitid = gitidmap[revid]
0.252.39 by Jelmer Vernooij
Update rather than overwrite refs.
179
            except KeyError:
0.200.525 by Jelmer Vernooij
Simplify push a bit further, make dpush without rebase faster.
180
                gitid = self.source_store._lookup_revision_sha1(revid)
0.200.480 by Jelmer Vernooij
Cope with API changes in Dulwich.
181
            self.target._git.refs[name] = gitid
0.200.942 by Jelmer Vernooij
pass update_refs to dfetch_refs.
182
            new_refs[name] = revid
0.200.822 by Jelmer Vernooij
Fix indication of number of revisions pushed in dpush.
183
        return revidmap, old_refs, new_refs
0.200.428 by Jelmer Vernooij
use dfetch_refs, to prepare for dpush to remote repositories.
184
0.252.3 by Jelmer Vernooij
Refactor revision finding code.
185
    def _find_missing_revs(self, stop_revisions):
186
        def check_revid(revid):
187
            if revid == NULL_REVISION:
188
                return True
0.252.43 by Jelmer Vernooij
Some refactoring, support proper file ids in revision deltas.
189
            sha_id = self.source_store._lookup_revision_sha1(revid)
0.252.3 by Jelmer Vernooij
Refactor revision finding code.
190
            try:
0.252.43 by Jelmer Vernooij
Some refactoring, support proper file ids in revision deltas.
191
                return (sha_id in self.target_store)
0.252.3 by Jelmer Vernooij
Refactor revision finding code.
192
            except errors.NoSuchRevision:
0.252.43 by Jelmer Vernooij
Some refactoring, support proper file ids in revision deltas.
193
                # Ghost, can't push
0.252.3 by Jelmer Vernooij
Refactor revision finding code.
194
                return True
195
        return list(self.missing_revisions(stop_revisions, check_revid))
196
0.200.947 by Jelmer Vernooij
Add convenience method for getting missing objects iterator.
197
    def _get_missing_objects_iterator(self, pb):
198
        return MissingObjectsIterator(self.source_store, self.source, pb)
199
0.200.524 by Jelmer Vernooij
Simplify dpushing multiple heads.
200
    def dfetch(self, stop_revisions):
0.200.357 by Jelmer Vernooij
Move push code to push.py.
201
        """Import the gist of the ancestry of a particular revision."""
0.200.428 by Jelmer Vernooij
use dfetch_refs, to prepare for dpush to remote repositories.
202
        gitidmap = {}
0.200.357 by Jelmer Vernooij
Move push code to push.py.
203
        revidmap = {}
0.200.367 by Jelmer Vernooij
In dfetch, skip fetching pushed revisions back, as cmd_dpush will already take care of that.
204
        self.source.lock_read()
0.200.357 by Jelmer Vernooij
Move push code to push.py.
205
        try:
0.252.3 by Jelmer Vernooij
Refactor revision finding code.
206
            todo = self._find_missing_revs(stop_revisions)
0.200.369 by Jelmer Vernooij
Report on pack objects progress.
207
            pb = ui.ui_factory.nested_progress_bar()
208
            try:
0.200.947 by Jelmer Vernooij
Add convenience method for getting missing objects iterator.
209
                object_generator = self._get_missing_objects_iterator()
0.200.369 by Jelmer Vernooij
Report on pack objects progress.
210
                for old_bzr_revid, git_commit in object_generator.import_revisions(
0.252.4 by Jelmer Vernooij
More work on roundtripping.
211
                    todo, roundtrip=False):
0.200.435 by Jelmer Vernooij
Remember mapping per InterRepository.
212
                    new_bzr_revid = self.mapping.revision_id_foreign_to_bzr(git_commit)
0.200.369 by Jelmer Vernooij
Report on pack objects progress.
213
                    revidmap[old_bzr_revid] = new_bzr_revid
0.200.428 by Jelmer Vernooij
use dfetch_refs, to prepare for dpush to remote repositories.
214
                    gitidmap[old_bzr_revid] = git_commit
0.252.3 by Jelmer Vernooij
Refactor revision finding code.
215
                self.target_store.add_objects(object_generator)
0.200.369 by Jelmer Vernooij
Report on pack objects progress.
216
            finally:
217
                pb.finished()
0.200.357 by Jelmer Vernooij
Move push code to push.py.
218
        finally:
219
            self.source.unlock()
0.200.428 by Jelmer Vernooij
use dfetch_refs, to prepare for dpush to remote repositories.
220
        return revidmap, gitidmap
0.200.357 by Jelmer Vernooij
Move push code to push.py.
221
0.252.4 by Jelmer Vernooij
More work on roundtripping.
222
    def fetch(self, revision_id=None, pb=None, find_ghosts=False,
223
            fetch_spec=None):
224
        if revision_id is not None:
225
            stop_revisions = [revision_id]
226
        elif fetch_spec is not None:
227
            stop_revisions = fetch_spec.heads
228
        else:
0.252.6 by Jelmer Vernooij
Roundtripping support for revision ids works.
229
            stop_revisions = self.source.all_revision_ids()
0.252.4 by Jelmer Vernooij
More work on roundtripping.
230
        self.source.lock_read()
231
        try:
232
            todo = self._find_missing_revs(stop_revisions)
233
            pb = ui.ui_factory.nested_progress_bar()
234
            try:
0.200.947 by Jelmer Vernooij
Add convenience method for getting missing objects iterator.
235
                object_generator = self._get_missing_objects_iterator(pb)
0.252.6 by Jelmer Vernooij
Roundtripping support for revision ids works.
236
                for (revid, git_sha) in object_generator.import_revisions(
237
                    todo, roundtrip=True):
0.252.11 by Jelmer Vernooij
only set refs/bzr for roundtripped revisions that otherwise couldn't be found.
238
                    try:
239
                        self.mapping.revision_id_bzr_to_foreign(revid)
240
                    except errors.InvalidRevisionId:
0.252.31 by Jelmer Vernooij
Properly escape revids when using them in ref names.
241
                        self.target_refs[self.mapping.revid_as_refname(revid)] = git_sha
0.252.4 by Jelmer Vernooij
More work on roundtripping.
242
                self.target_store.add_objects(object_generator)
243
            finally:
244
                pb.finished()
245
        finally:
246
            self.source.unlock()
247
0.200.291 by Jelmer Vernooij
Print proper error about not supporting push.
248
    @staticmethod
249
    def is_compatible(source, target):
250
        """Be compatible with GitRepository."""
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
251
        return (not isinstance(source, GitRepository) and
0.200.425 by Jelmer Vernooij
Split out push to remote git repositories.
252
                isinstance(target, LocalGitRepository))
253
254
255
class InterToRemoteGitRepository(InterToGitRepository):
256
0.200.942 by Jelmer Vernooij
pass update_refs to dfetch_refs.
257
    def dfetch_refs(self, update_refs):
0.200.425 by Jelmer Vernooij
Split out push to remote git repositories.
258
        """Import the gist of the ancestry of a particular revision."""
259
        revidmap = {}
0.200.942 by Jelmer Vernooij
pass update_refs to dfetch_refs.
260
        def determine_wants(old_refs):
0.200.429 by Jelmer Vernooij
get remote dpush to a point where we now what to send.
261
            ret = {}
0.200.942 by Jelmer Vernooij
pass update_refs to dfetch_refs.
262
            self.old_refs = old_refs
263
            self.new_refs = update_refs(self.old_refs)
264
            for name, revid in self.new_refs.iteritems():
0.200.525 by Jelmer Vernooij
Simplify push a bit further, make dpush without rebase faster.
265
                ret[name] = self.source_store._lookup_revision_sha1(revid)
0.200.429 by Jelmer Vernooij
get remote dpush to a point where we now what to send.
266
            return ret
0.200.425 by Jelmer Vernooij
Split out push to remote git repositories.
267
        self.source.lock_read()
268
        try:
0.200.460 by Jelmer Vernooij
Somewhat fix commit in git working trees.
269
            new_refs = self.target.send_pack(determine_wants,
0.252.37 by Jelmer Vernooij
Factor out some common code for finding refs to send.
270
                    self.source_store.generate_lossy_pack_contents)
0.200.425 by Jelmer Vernooij
Split out push to remote git repositories.
271
        finally:
272
            self.source.unlock()
0.200.942 by Jelmer Vernooij
pass update_refs to dfetch_refs.
273
        return revidmap, self.old_refs, self.new_refs
0.200.425 by Jelmer Vernooij
Split out push to remote git repositories.
274
0.200.944 by Jelmer Vernooij
Properly error about not supporting push.
275
    def fetch_refs(self, update_refs):
0.252.4 by Jelmer Vernooij
More work on roundtripping.
276
        raise NoPushSupport()
277
0.200.425 by Jelmer Vernooij
Split out push to remote git repositories.
278
    @staticmethod
279
    def is_compatible(source, target):
280
        """Be compatible with GitRepository."""
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
281
        return (not isinstance(source, GitRepository) and
0.200.425 by Jelmer Vernooij
Split out push to remote git repositories.
282
                isinstance(target, RemoteGitRepository))