/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to commands.py

  • Committer: Vincent Ladeuil
  • Date: 2010-01-25 15:55:48 UTC
  • mto: (4985.1.4 add-attr-cleanup)
  • mto: This revision was merged to the branch mainline in revision 4988.
  • Revision ID: v.ladeuil+lp@free.fr-20100125155548-0l352pujvt5bzl5e
Deploy addAttrCleanup on the whole test suite.

Several use case worth mentioning:

- setting a module or any other object attribute is the majority
by far. In some cases the setting itself is deferred but most of
the time we want to set at the same time we add the cleanup.

- there multiple occurrences of protecting hooks or ui factory
which are now useless (the test framework takes care of that now),

- there was some lambda uses that can now be avoided.

That first cleanup already simplifies things a lot.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2009 Canonical Ltd
2
 
 
3
 
# Authors: Robert Collins <robert.collins@canonical.com>
4
 
#          Jelmer Vernooij <jelmer@samba.org>
5
 
#          John Carr <john.carr@unrouted.co.uk>
6
 
#
7
 
# This program is free software; you can redistribute it and/or modify
8
 
# it under the terms of the GNU General Public License as published by
9
 
# the Free Software Foundation; either version 2 of the License, or
10
 
# (at your option) any later version.
11
 
#
12
 
# This program is distributed in the hope that it will be useful,
13
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 
# GNU General Public License for more details.
16
 
#
17
 
# You should have received a copy of the GNU General Public License
18
 
# along with this program; if not, write to the Free Software
19
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20
 
 
21
 
"""Git-specific subcommands for Bazaar."""
22
 
 
23
 
from bzrlib.commands import (
24
 
    Command,
25
 
    display_command,
26
 
    )
27
 
from bzrlib.option import (
28
 
    Option,
29
 
    )
30
 
 
31
 
 
32
 
class cmd_git_import(Command):
33
 
    """Import all branches from a git repository.
34
 
 
35
 
    """
36
 
 
37
 
    takes_args = ["src_location", "dest_location?"]
38
 
 
39
 
    def run(self, src_location, dest_location=None):
40
 
        import os
41
 
        from bzrlib import (
42
 
            ui,
43
 
            urlutils,
44
 
            )
45
 
        from bzrlib.bzrdir import (
46
 
            BzrDir,
47
 
            )
48
 
        from bzrlib.errors import (
49
 
            BzrCommandError,
50
 
            NoRepositoryPresent,
51
 
            NotBranchError,
52
 
            )
53
 
        from bzrlib.repository import (
54
 
            InterRepository,
55
 
            Repository,
56
 
            )
57
 
        from bzrlib.plugins.git.branch import (
58
 
            GitBranch,
59
 
            extract_tags,
60
 
            )
61
 
        from bzrlib.plugins.git.repository import GitRepository
62
 
 
63
 
        if dest_location is None:
64
 
            dest_location = os.path.basename(src_location.rstrip("/\\"))
65
 
 
66
 
        source_repo = Repository.open(src_location)
67
 
        if not isinstance(source_repo, GitRepository):
68
 
            raise BzrCommandError("%r is not a git repository" % src_location)
69
 
        try:
70
 
            target_bzrdir = BzrDir.open(dest_location)
71
 
        except NotBranchError:
72
 
            target_bzrdir = BzrDir.create(dest_location)
73
 
        try:
74
 
            target_repo = target_bzrdir.find_repository()
75
 
        except NoRepositoryPresent:
76
 
            target_repo = target_bzrdir.create_repository(shared=True)
77
 
 
78
 
        if not target_repo.supports_rich_root():
79
 
            raise BzrCommandError("Target repository doesn't support rich roots")
80
 
 
81
 
        interrepo = InterRepository.get(source_repo, target_repo)
82
 
        mapping = source_repo.get_mapping()
83
 
        refs = interrepo.fetch()
84
 
        tags = {}
85
 
        for k, v in extract_tags(refs).iteritems():
86
 
            tags[k] = mapping.revision_id_foreign_to_bzr(v)
87
 
        pb = ui.ui_factory.nested_progress_bar()
88
 
        try:
89
 
            for i, (name, ref) in enumerate(refs.iteritems()):
90
 
                if name.startswith("refs/tags/"):
91
 
                    continue
92
 
                pb.update("creating branches", i, len(refs))
93
 
                head_loc = os.path.join(dest_location, name)
94
 
                try:
95
 
                    head_bzrdir = BzrDir.open(head_loc)
96
 
                except NotBranchError:
97
 
                    parent_path = urlutils.dirname(head_loc)
98
 
                    if not os.path.isdir(parent_path):
99
 
                        os.makedirs(parent_path)
100
 
                    head_bzrdir = BzrDir.create(head_loc)
101
 
                try:
102
 
                    head_branch = head_bzrdir.open_branch()
103
 
                except NotBranchError:
104
 
                    head_branch = head_bzrdir.create_branch()
105
 
                revid = mapping.revision_id_foreign_to_bzr(ref)
106
 
                source_branch = GitBranch(source_repo.bzrdir, source_repo,
107
 
                    name, None, tags)
108
 
                source_branch.head = ref
109
 
                if head_branch.last_revision() != revid:
110
 
                    head_branch.generate_revision_history(revid)
111
 
                source_branch.tags.merge_to(head_branch.tags)
112
 
        finally:
113
 
            pb.finished()
114
 
 
115
 
 
116
 
class cmd_git_object(Command):
117
 
    """List or display Git objects by SHA.
118
 
 
119
 
    Cat a particular object's Git representation if a SHA is specified.
120
 
    List all available SHAs otherwise.
121
 
    """
122
 
 
123
 
    hidden = True
124
 
 
125
 
    aliases = ["git-objects", "git-cat"]
126
 
    takes_args = ["sha1?"]
127
 
    takes_options = [Option('directory',
128
 
        short_name='d',
129
 
        help='Location of repository.', type=unicode),
130
 
        Option('pretty', help='Pretty-print objects.')]
131
 
    encoding_type = 'exact'
132
 
 
133
 
    @display_command
134
 
    def run(self, sha1=None, directory=".", pretty=False):
135
 
        from bzrlib.errors import (
136
 
            BzrCommandError,
137
 
            )
138
 
        from bzrlib.bzrdir import (
139
 
            BzrDir,
140
 
            )
141
 
        bzrdir, _ = BzrDir.open_containing(directory)
142
 
        repo = bzrdir.find_repository()
143
 
        from bzrlib.plugins.git.object_store import (
144
 
            get_object_store,
145
 
            )
146
 
        object_store = get_object_store(repo)
147
 
        repo.lock_read()
148
 
        try:
149
 
            if sha1 is not None:
150
 
                try:
151
 
                    obj = object_store[str(sha1)]
152
 
                except KeyError:
153
 
                    raise BzrCommandError("Object not found: %s" % sha1)
154
 
                if pretty:
155
 
                    text = obj.as_pretty_string()
156
 
                else:
157
 
                    text = obj.as_raw_string()
158
 
                self.outf.write(text)
159
 
            else:
160
 
                for sha1 in object_store:
161
 
                    self.outf.write("%s\n" % sha1)
162
 
        finally:
163
 
            repo.unlock()
164
 
 
165
 
 
166
 
class cmd_git_refs(Command):
167
 
    """Output all of the virtual refs for a repository.
168
 
 
169
 
    """
170
 
 
171
 
    hidden = True
172
 
 
173
 
    takes_options = [Option('directory',
174
 
        short_name='d',
175
 
        help='Location of repository.', type=unicode)]
176
 
 
177
 
    @display_command
178
 
    def run(self, directory="."):
179
 
        from bzrlib.bzrdir import (
180
 
            BzrDir,
181
 
            )
182
 
        from bzrlib.plugins.git.refs import (
183
 
            BazaarRefsContainer,
184
 
            )
185
 
        from bzrlib.plugins.git.object_store import (
186
 
            get_object_store,
187
 
            )
188
 
        bzrdir, _ = BzrDir.open_containing(directory)
189
 
        repo = bzrdir.find_repository()
190
 
        repo.lock_read()
191
 
        try:
192
 
            object_store = get_object_store(repo)
193
 
            refs = BazaarRefsContainer(bzrdir, object_store)
194
 
            for k, v in refs.as_dict().iteritems():
195
 
                self.outf.write("%s -> %s\n" % (k, v))
196
 
        finally:
197
 
            repo.unlock()
198
 
 
199
 
 
200
 
class cmd_git_apply(Command):
201
 
    """Apply a series of git-am style patches.
202
 
 
203
 
    This command will in the future probably be integrated into 
204
 
    "bzr pull".
205
 
    """
206
 
 
207
 
    takes_args = ["patches*"]
208
 
 
209
 
    def _apply_patch(self, wt, f):
210
 
        from dulwich.patch import git_am_patch_split
211
 
        (c, diff, version) = git_am_patch_split(f)
212
 
        # FIXME: Process diff
213
 
        wt.commit(committer=c.committer,
214
 
                  message=c.message)
215
 
 
216
 
    def run(self, patches_list=None):
217
 
        from bzrlib.workingtree import WorkingTree
218
 
        if patches_list is None:
219
 
            patches_list = []
220
 
        
221
 
        tree, _ = WorkingTree.open_containing(".")
222
 
        tree.lock_write()
223
 
        try:
224
 
            for patch in patches_list:
225
 
                f = open(patch, 'r')
226
 
                try:
227
 
                    self._apply_patch(tree, f)
228
 
                finally:
229
 
                    f.close()
230
 
        finally:
231
 
            tree.unlock()