/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.200.371 by Jelmer Vernooij
Add progress bar when determining revisions to dpush
119
        pb = ui.ui_factory.nested_progress_bar()
120
        try:
121
            graph = self.source.get_graph()
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
            return graph.iter_topo_order(missing)
127
        finally:
128
            pb.finished()
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
151
            try:
152
                return (self.source_store._lookup_revision_sha1(revid) in self.target_store)
153
            except errors.NoSuchRevision:
154
                # Ghost, can't dpush
155
                return True
156
        return list(self.missing_revisions(stop_revisions, check_revid))
157
0.200.524 by Jelmer Vernooij
Simplify dpushing multiple heads.
158
    def dfetch(self, stop_revisions):
0.200.357 by Jelmer Vernooij
Move push code to push.py.
159
        """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.
160
        gitidmap = {}
0.200.357 by Jelmer Vernooij
Move push code to push.py.
161
        revidmap = {}
0.200.367 by Jelmer Vernooij
In dfetch, skip fetching pushed revisions back, as cmd_dpush will already take care of that.
162
        self.source.lock_read()
0.200.357 by Jelmer Vernooij
Move push code to push.py.
163
        try:
0.252.3 by Jelmer Vernooij
Refactor revision finding code.
164
            todo = self._find_missing_revs(stop_revisions)
0.200.369 by Jelmer Vernooij
Report on pack objects progress.
165
            pb = ui.ui_factory.nested_progress_bar()
166
            try:
0.252.3 by Jelmer Vernooij
Refactor revision finding code.
167
                object_generator = MissingObjectsIterator(self.source_store,
168
                    self.source, pb)
0.200.369 by Jelmer Vernooij
Report on pack objects progress.
169
                for old_bzr_revid, git_commit in object_generator.import_revisions(
0.252.4 by Jelmer Vernooij
More work on roundtripping.
170
                    todo, roundtrip=False):
0.200.435 by Jelmer Vernooij
Remember mapping per InterRepository.
171
                    new_bzr_revid = self.mapping.revision_id_foreign_to_bzr(git_commit)
0.200.369 by Jelmer Vernooij
Report on pack objects progress.
172
                    revidmap[old_bzr_revid] = new_bzr_revid
0.200.428 by Jelmer Vernooij
use dfetch_refs, to prepare for dpush to remote repositories.
173
                    gitidmap[old_bzr_revid] = git_commit
0.252.3 by Jelmer Vernooij
Refactor revision finding code.
174
                self.target_store.add_objects(object_generator)
0.200.369 by Jelmer Vernooij
Report on pack objects progress.
175
            finally:
176
                pb.finished()
0.200.357 by Jelmer Vernooij
Move push code to push.py.
177
        finally:
178
            self.source.unlock()
0.200.428 by Jelmer Vernooij
use dfetch_refs, to prepare for dpush to remote repositories.
179
        return revidmap, gitidmap
0.200.357 by Jelmer Vernooij
Move push code to push.py.
180
0.252.4 by Jelmer Vernooij
More work on roundtripping.
181
    def fetch(self, revision_id=None, pb=None, find_ghosts=False,
182
            fetch_spec=None):
183
        if revision_id is not None:
184
            stop_revisions = [revision_id]
185
        elif fetch_spec is not None:
186
            stop_revisions = fetch_spec.heads
187
        else:
0.252.6 by Jelmer Vernooij
Roundtripping support for revision ids works.
188
            stop_revisions = self.source.all_revision_ids()
0.252.4 by Jelmer Vernooij
More work on roundtripping.
189
        self.source.lock_read()
190
        try:
191
            todo = self._find_missing_revs(stop_revisions)
192
            pb = ui.ui_factory.nested_progress_bar()
193
            try:
194
                object_generator = MissingObjectsIterator(self.source_store,
195
                    self.source, pb)
0.252.6 by Jelmer Vernooij
Roundtripping support for revision ids works.
196
                for (revid, git_sha) in object_generator.import_revisions(
197
                    todo, roundtrip=True):
0.252.11 by Jelmer Vernooij
only set refs/bzr for roundtripped revisions that otherwise couldn't be found.
198
                    try:
199
                        self.mapping.revision_id_bzr_to_foreign(revid)
200
                    except errors.InvalidRevisionId:
0.252.31 by Jelmer Vernooij
Properly escape revids when using them in ref names.
201
                        self.target_refs[self.mapping.revid_as_refname(revid)] = git_sha
0.252.4 by Jelmer Vernooij
More work on roundtripping.
202
                self.target_store.add_objects(object_generator)
203
            finally:
204
                pb.finished()
205
        finally:
206
            self.source.unlock()
207
0.200.291 by Jelmer Vernooij
Print proper error about not supporting push.
208
    @staticmethod
209
    def is_compatible(source, target):
210
        """Be compatible with GitRepository."""
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
211
        return (not isinstance(source, GitRepository) and
0.200.425 by Jelmer Vernooij
Split out push to remote git repositories.
212
                isinstance(target, LocalGitRepository))
213
214
215
class InterToRemoteGitRepository(InterToGitRepository):
216
0.200.429 by Jelmer Vernooij
get remote dpush to a point where we now what to send.
217
    def dfetch_refs(self, new_refs):
0.200.425 by Jelmer Vernooij
Split out push to remote git repositories.
218
        """Import the gist of the ancestry of a particular revision."""
219
        revidmap = {}
0.200.822 by Jelmer Vernooij
Fix indication of number of revisions pushed in dpush.
220
        old_refs = {}
0.200.452 by Jelmer Vernooij
Rename converter -> object_store, provide utility function for getting ObjectStore's.
221
        def determine_wants(refs):
0.200.429 by Jelmer Vernooij
get remote dpush to a point where we now what to send.
222
            ret = {}
0.200.822 by Jelmer Vernooij
Fix indication of number of revisions pushed in dpush.
223
            old_refs.update(new_refs)
0.200.429 by Jelmer Vernooij
get remote dpush to a point where we now what to send.
224
            for name, revid in new_refs.iteritems():
0.200.525 by Jelmer Vernooij
Simplify push a bit further, make dpush without rebase faster.
225
                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.
226
            return ret
0.200.425 by Jelmer Vernooij
Split out push to remote git repositories.
227
        self.source.lock_read()
228
        try:
0.200.460 by Jelmer Vernooij
Somewhat fix commit in git working trees.
229
            new_refs = self.target.send_pack(determine_wants,
0.252.37 by Jelmer Vernooij
Factor out some common code for finding refs to send.
230
                    self.source_store.generate_lossy_pack_contents)
0.200.425 by Jelmer Vernooij
Split out push to remote git repositories.
231
        finally:
232
            self.source.unlock()
0.200.822 by Jelmer Vernooij
Fix indication of number of revisions pushed in dpush.
233
        return revidmap, old_refs, new_refs
0.200.425 by Jelmer Vernooij
Split out push to remote git repositories.
234
0.252.4 by Jelmer Vernooij
More work on roundtripping.
235
    def fetch(self, revision_id=None, pb=None, find_ghosts=False,
236
            fetch_spec=None):
237
        raise NoPushSupport()
238
0.200.425 by Jelmer Vernooij
Split out push to remote git repositories.
239
    @staticmethod
240
    def is_compatible(source, target):
241
        """Be compatible with GitRepository."""
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
242
        return (not isinstance(source, GitRepository) and
0.200.425 by Jelmer Vernooij
Split out push to remote git repositories.
243
                isinstance(target, RemoteGitRepository))