/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.369 by Jelmer Vernooij
Report on pack objects progress.
64
        for i, revid in enumerate(revids):
65
            if self.pb:
66
                self.pb.update("pushing revisions", i, len(revids))
0.252.4 by Jelmer Vernooij
More work on roundtripping.
67
            git_commit = self.import_revision(revid, roundtrip)
0.252.6 by Jelmer Vernooij
Roundtripping support for revision ids works.
68
            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.
69
0.252.4 by Jelmer Vernooij
More work on roundtripping.
70
    def import_revision(self, revid, roundtrip):
0.200.364 by Jelmer Vernooij
Reimplement dpush, but more efficient and only writing a single pack file rather than one per revision.
71
        """Import the gist of a revision into this Git repository.
72
73
        """
0.200.852 by Jelmer Vernooij
Cache trees rather than inventories.
74
        tree = self._object_store.tree_cache.revision_tree(revid)
0.200.548 by Jelmer Vernooij
Extract unusual file modes from revision when reconstructing Trees.
75
        rev = self.source.get_revision(revid)
0.200.784 by Jelmer Vernooij
Use common object generation code in push.
76
        commit = None
0.252.4 by Jelmer Vernooij
More work on roundtripping.
77
        for path, obj, ie in self._object_store._revision_to_objects(rev, tree,
78
            roundtrip):
0.200.829 by Jelmer Vernooij
Cope with the fact that _type is gone in upstream dulwich.
79
            if obj.type_name == "commit":
0.200.784 by Jelmer Vernooij
Use common object generation code in push.
80
                commit = obj
0.200.786 by Jelmer Vernooij
Simplify push code.
81
            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.
82
        return commit.id
83
84
    def __len__(self):
85
        return len(self._pending)
86
87
    def __iter__(self):
0.200.786 by Jelmer Vernooij
Simplify push code.
88
        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.
89
90
0.200.291 by Jelmer Vernooij
Print proper error about not supporting push.
91
class InterToGitRepository(InterRepository):
92
    """InterRepository that copies into a Git repository."""
93
94
    _matching_repo_format = GitRepositoryFormat()
95
0.200.435 by Jelmer Vernooij
Remember mapping per InterRepository.
96
    def __init__(self, source, target):
97
        super(InterToGitRepository, self).__init__(source, target)
98
        self.mapping = self.target.get_mapping()
0.200.525 by Jelmer Vernooij
Simplify push a bit further, make dpush without rebase faster.
99
        self.source_store = BazaarObjectStore(self.source, self.mapping)
0.200.435 by Jelmer Vernooij
Remember mapping per InterRepository.
100
0.200.291 by Jelmer Vernooij
Print proper error about not supporting push.
101
    @staticmethod
102
    def _get_repo_format_to_test():
103
        return None
104
105
    def copy_content(self, revision_id=None, pb=None):
106
        """See InterRepository.copy_content."""
107
        self.fetch(revision_id, pb, find_ghosts=False)
108
0.200.425 by Jelmer Vernooij
Split out push to remote git repositories.
109
110
class InterToLocalGitRepository(InterToGitRepository):
111
0.252.3 by Jelmer Vernooij
Refactor revision finding code.
112
    def __init__(self, source, target):
113
        super(InterToLocalGitRepository, self).__init__(source, target)
114
        self.target_store = self.target._git.object_store
0.252.6 by Jelmer Vernooij
Roundtripping support for revision ids works.
115
        self.target_refs = self.target._git.refs
0.252.3 by Jelmer Vernooij
Refactor revision finding code.
116
0.200.525 by Jelmer Vernooij
Simplify push a bit further, make dpush without rebase faster.
117
    def missing_revisions(self, stop_revisions, check_revid):
0.200.357 by Jelmer Vernooij
Move push code to push.py.
118
        missing = []
0.252.43 by Jelmer Vernooij
Some refactoring, support proper file ids in revision deltas.
119
        graph = self.source.get_graph()
0.200.371 by Jelmer Vernooij
Add progress bar when determining revisions to dpush
120
        pb = ui.ui_factory.nested_progress_bar()
121
        try:
0.200.524 by Jelmer Vernooij
Simplify dpushing multiple heads.
122
            for revid, _ in graph.iter_ancestry(stop_revisions):
0.200.371 by Jelmer Vernooij
Add progress bar when determining revisions to dpush
123
                pb.update("determining revisions to fetch", len(missing))
0.200.525 by Jelmer Vernooij
Simplify push a bit further, make dpush without rebase faster.
124
                if not check_revid(revid):
0.200.371 by Jelmer Vernooij
Add progress bar when determining revisions to dpush
125
                    missing.append(revid)
126
        finally:
127
            pb.finished()
0.252.43 by Jelmer Vernooij
Some refactoring, support proper file ids in revision deltas.
128
        return graph.iter_topo_order(missing)
0.200.357 by Jelmer Vernooij
Move push code to push.py.
129
0.252.5 by Jelmer Vernooij
enable 'bzr push'.
130
    def fetch_refs(self, refs):
131
        fetch_spec = PendingAncestryResult(refs.values(), self.source)
132
        self.fetch(fetch_spec=fetch_spec)
133
0.200.428 by Jelmer Vernooij
use dfetch_refs, to prepare for dpush to remote repositories.
134
    def dfetch_refs(self, refs):
0.200.822 by Jelmer Vernooij
Fix indication of number of revisions pushed in dpush.
135
        old_refs = self.target._git.get_refs()
0.252.39 by Jelmer Vernooij
Update rather than overwrite refs.
136
        new_refs = dict(old_refs)
0.200.524 by Jelmer Vernooij
Simplify dpushing multiple heads.
137
        revidmap, gitidmap = self.dfetch(refs.values())
0.200.428 by Jelmer Vernooij
use dfetch_refs, to prepare for dpush to remote repositories.
138
        for name, revid in refs.iteritems():
0.252.39 by Jelmer Vernooij
Update rather than overwrite refs.
139
            try:
0.200.524 by Jelmer Vernooij
Simplify dpushing multiple heads.
140
                gitid = gitidmap[revid]
0.252.39 by Jelmer Vernooij
Update rather than overwrite refs.
141
            except KeyError:
0.200.525 by Jelmer Vernooij
Simplify push a bit further, make dpush without rebase faster.
142
                gitid = self.source_store._lookup_revision_sha1(revid)
0.200.480 by Jelmer Vernooij
Cope with API changes in Dulwich.
143
            self.target._git.refs[name] = gitid
0.200.438 by Jelmer Vernooij
Somewhat fix dpushing to remote repos.
144
            new_refs[name] = gitid
0.200.822 by Jelmer Vernooij
Fix indication of number of revisions pushed in dpush.
145
        return revidmap, old_refs, new_refs
0.200.428 by Jelmer Vernooij
use dfetch_refs, to prepare for dpush to remote repositories.
146
0.252.3 by Jelmer Vernooij
Refactor revision finding code.
147
    def _find_missing_revs(self, stop_revisions):
148
        def check_revid(revid):
149
            if revid == NULL_REVISION:
150
                return True
0.252.43 by Jelmer Vernooij
Some refactoring, support proper file ids in revision deltas.
151
            sha_id = self.source_store._lookup_revision_sha1(revid)
0.252.3 by Jelmer Vernooij
Refactor revision finding code.
152
            try:
0.252.43 by Jelmer Vernooij
Some refactoring, support proper file ids in revision deltas.
153
                return (sha_id in self.target_store)
0.252.3 by Jelmer Vernooij
Refactor revision finding code.
154
            except errors.NoSuchRevision:
0.252.43 by Jelmer Vernooij
Some refactoring, support proper file ids in revision deltas.
155
                # Ghost, can't push
0.252.3 by Jelmer Vernooij
Refactor revision finding code.
156
                return True
157
        return list(self.missing_revisions(stop_revisions, check_revid))
158
0.200.524 by Jelmer Vernooij
Simplify dpushing multiple heads.
159
    def dfetch(self, stop_revisions):
0.200.357 by Jelmer Vernooij
Move push code to push.py.
160
        """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.
161
        gitidmap = {}
0.200.357 by Jelmer Vernooij
Move push code to push.py.
162
        revidmap = {}
0.200.367 by Jelmer Vernooij
In dfetch, skip fetching pushed revisions back, as cmd_dpush will already take care of that.
163
        self.source.lock_read()
0.200.357 by Jelmer Vernooij
Move push code to push.py.
164
        try:
0.252.3 by Jelmer Vernooij
Refactor revision finding code.
165
            todo = self._find_missing_revs(stop_revisions)
0.200.369 by Jelmer Vernooij
Report on pack objects progress.
166
            pb = ui.ui_factory.nested_progress_bar()
167
            try:
0.252.3 by Jelmer Vernooij
Refactor revision finding code.
168
                object_generator = MissingObjectsIterator(self.source_store,
169
                    self.source, pb)
0.200.369 by Jelmer Vernooij
Report on pack objects progress.
170
                for old_bzr_revid, git_commit in object_generator.import_revisions(
0.252.4 by Jelmer Vernooij
More work on roundtripping.
171
                    todo, roundtrip=False):
0.200.435 by Jelmer Vernooij
Remember mapping per InterRepository.
172
                    new_bzr_revid = self.mapping.revision_id_foreign_to_bzr(git_commit)
0.200.369 by Jelmer Vernooij
Report on pack objects progress.
173
                    revidmap[old_bzr_revid] = new_bzr_revid
0.200.428 by Jelmer Vernooij
use dfetch_refs, to prepare for dpush to remote repositories.
174
                    gitidmap[old_bzr_revid] = git_commit
0.252.3 by Jelmer Vernooij
Refactor revision finding code.
175
                self.target_store.add_objects(object_generator)
0.200.369 by Jelmer Vernooij
Report on pack objects progress.
176
            finally:
177
                pb.finished()
0.200.357 by Jelmer Vernooij
Move push code to push.py.
178
        finally:
179
            self.source.unlock()
0.200.428 by Jelmer Vernooij
use dfetch_refs, to prepare for dpush to remote repositories.
180
        return revidmap, gitidmap
0.200.357 by Jelmer Vernooij
Move push code to push.py.
181
0.252.4 by Jelmer Vernooij
More work on roundtripping.
182
    def fetch(self, revision_id=None, pb=None, find_ghosts=False,
183
            fetch_spec=None):
184
        if revision_id is not None:
185
            stop_revisions = [revision_id]
186
        elif fetch_spec is not None:
187
            stop_revisions = fetch_spec.heads
188
        else:
0.252.6 by Jelmer Vernooij
Roundtripping support for revision ids works.
189
            stop_revisions = self.source.all_revision_ids()
0.252.4 by Jelmer Vernooij
More work on roundtripping.
190
        self.source.lock_read()
191
        try:
192
            todo = self._find_missing_revs(stop_revisions)
193
            pb = ui.ui_factory.nested_progress_bar()
194
            try:
195
                object_generator = MissingObjectsIterator(self.source_store,
196
                    self.source, pb)
0.252.6 by Jelmer Vernooij
Roundtripping support for revision ids works.
197
                for (revid, git_sha) in object_generator.import_revisions(
198
                    todo, roundtrip=True):
0.252.11 by Jelmer Vernooij
only set refs/bzr for roundtripped revisions that otherwise couldn't be found.
199
                    try:
200
                        self.mapping.revision_id_bzr_to_foreign(revid)
201
                    except errors.InvalidRevisionId:
0.252.31 by Jelmer Vernooij
Properly escape revids when using them in ref names.
202
                        self.target_refs[self.mapping.revid_as_refname(revid)] = git_sha
0.252.4 by Jelmer Vernooij
More work on roundtripping.
203
                self.target_store.add_objects(object_generator)
204
            finally:
205
                pb.finished()
206
        finally:
207
            self.source.unlock()
208
0.200.291 by Jelmer Vernooij
Print proper error about not supporting push.
209
    @staticmethod
210
    def is_compatible(source, target):
211
        """Be compatible with GitRepository."""
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
212
        return (not isinstance(source, GitRepository) and
0.200.425 by Jelmer Vernooij
Split out push to remote git repositories.
213
                isinstance(target, LocalGitRepository))
214
215
216
class InterToRemoteGitRepository(InterToGitRepository):
217
0.200.429 by Jelmer Vernooij
get remote dpush to a point where we now what to send.
218
    def dfetch_refs(self, new_refs):
0.200.425 by Jelmer Vernooij
Split out push to remote git repositories.
219
        """Import the gist of the ancestry of a particular revision."""
220
        revidmap = {}
0.200.822 by Jelmer Vernooij
Fix indication of number of revisions pushed in dpush.
221
        old_refs = {}
0.200.452 by Jelmer Vernooij
Rename converter -> object_store, provide utility function for getting ObjectStore's.
222
        def determine_wants(refs):
0.200.429 by Jelmer Vernooij
get remote dpush to a point where we now what to send.
223
            ret = {}
0.200.822 by Jelmer Vernooij
Fix indication of number of revisions pushed in dpush.
224
            old_refs.update(new_refs)
0.200.429 by Jelmer Vernooij
get remote dpush to a point where we now what to send.
225
            for name, revid in new_refs.iteritems():
0.200.525 by Jelmer Vernooij
Simplify push a bit further, make dpush without rebase faster.
226
                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.
227
            return ret
0.200.425 by Jelmer Vernooij
Split out push to remote git repositories.
228
        self.source.lock_read()
229
        try:
0.200.460 by Jelmer Vernooij
Somewhat fix commit in git working trees.
230
            new_refs = self.target.send_pack(determine_wants,
0.252.37 by Jelmer Vernooij
Factor out some common code for finding refs to send.
231
                    self.source_store.generate_lossy_pack_contents)
0.200.425 by Jelmer Vernooij
Split out push to remote git repositories.
232
        finally:
233
            self.source.unlock()
0.200.822 by Jelmer Vernooij
Fix indication of number of revisions pushed in dpush.
234
        return revidmap, old_refs, new_refs
0.200.425 by Jelmer Vernooij
Split out push to remote git repositories.
235
0.252.4 by Jelmer Vernooij
More work on roundtripping.
236
    def fetch(self, revision_id=None, pb=None, find_ghosts=False,
237
            fetch_spec=None):
238
        raise NoPushSupport()
239
0.200.425 by Jelmer Vernooij
Split out push to remote git repositories.
240
    @staticmethod
241
    def is_compatible(source, target):
242
        """Be compatible with GitRepository."""
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
243
        return (not isinstance(source, GitRepository) and
0.200.425 by Jelmer Vernooij
Split out push to remote git repositories.
244
                isinstance(target, RemoteGitRepository))