/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 dir.py

Add convenience method for getting missing objects iterator.

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# along with this program; if not, write to the Free Software
16
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
17
 
18
 
"""An adapter between a Git control dir and a Bazaar ControlDir."""
 
18
"""An adapter between a Git control dir and a Bazaar BzrDir."""
19
19
 
20
20
from bzrlib import (
 
21
    bzrdir,
21
22
    errors as bzr_errors,
22
23
    lockable_files,
23
24
    urlutils,
27
28
LockWarner = getattr(lockable_files, "_LockWarner", None)
28
29
 
29
30
from bzrlib.plugins.git import (
30
 
    BareLocalGitControlDirFormat,
31
 
    LocalGitControlDirFormat,
 
31
    LocalGitBzrDirFormat,
32
32
    )
33
 
try:
34
 
    from bzrlib.controldir import (
35
 
        ControlDir,
36
 
        format_registry,
37
 
        )
38
 
except ImportError:
39
 
    # bzr < 2.3
40
 
    from bzrlib.bzrdir import (
41
 
        BzrDir,
42
 
        format_registry,
43
 
        )
44
 
    ControlDir = BzrDir
45
33
 
46
34
 
47
35
class GitLock(object):
81
69
            self._lock_warner = LockWarner(repr(self))
82
70
 
83
71
 
84
 
class GitDirConfig(object):
85
 
 
86
 
    def get_default_stack_on(self):
87
 
        return None
88
 
 
89
 
    def set_default_stack_on(self, value):
90
 
        raise bzr_errors.BzrError("Cannot set configuration")
91
 
 
92
 
 
93
 
class GitDir(ControlDir):
 
72
class GitDir(bzrdir.BzrDir):
94
73
    """An adapter to the '.git' dir used by git."""
95
74
 
96
75
    def is_supported(self):
97
76
        return True
98
77
 
99
 
    def can_convert_format(self):
100
 
        return False
101
 
 
102
 
    def break_lock(self):
103
 
        pass
104
 
 
105
78
    def cloning_metadir(self, stacked=False):
106
 
        return format_registry.make_bzrdir("default")
 
79
        return bzrdir.format_registry.make_bzrdir("default")
107
80
 
108
81
    def _branch_name_to_ref(self, name):
109
82
        raise NotImplementedError(self._branch_name_to_ref)
110
83
 
111
84
    if bzrlib_version >= (2, 2):
112
 
        def open_branch(self, name=None, unsupported=False, 
113
 
            ignore_fallbacks=None):
 
85
        def open_branch(self, name=None, ignore_fallbacks=None,
 
86
            unsupported=False):
114
87
            return self._open_branch(name=name,
115
88
                ignore_fallbacks=ignore_fallbacks, unsupported=unsupported)
116
89
    else:
118
91
            return self._open_branch(name=None,
119
92
                ignore_fallbacks=ignore_fallbacks, unsupported=unsupported)
120
93
 
121
 
    def get_config(self):
122
 
        return GitDirConfig()
123
 
 
124
94
 
125
95
class LocalGitDir(GitDir):
126
96
    """An adapter to the '.git' dir used by git."""
131
101
 
132
102
    _gitrepository_class = property(_get_gitrepository_class)
133
103
 
134
 
    @property
135
 
    def user_transport(self):
136
 
        return self.root_transport
137
 
 
138
 
    @property
139
 
    def control_transport(self):
140
 
        return self.transport
141
 
 
142
104
    def __init__(self, transport, lockfiles, gitrepo, format):
143
105
        self._format = format
144
106
        self.root_transport = transport
145
 
        self._mode_check_done = False
146
107
        self._git = gitrepo
147
108
        if gitrepo.bare:
148
109
            self.transport = transport
164
125
    def is_control_filename(self, filename):
165
126
        return filename == '.git' or filename.startswith('.git/')
166
127
 
167
 
    def get_branch_transport(self, branch_format, name=None):
 
128
    def get_branch_transport(self, branch_format, name):
168
129
        if branch_format is None:
169
130
            return self.transport
170
 
        if isinstance(branch_format, LocalGitControlDirFormat):
 
131
        if isinstance(branch_format, LocalGitBzrDirFormat):
171
132
            return self.transport
172
133
        raise bzr_errors.IncompatibleFormat(branch_format, self._format)
173
134
 
174
135
    def get_repository_transport(self, format):
175
136
        if format is None:
176
137
            return self.transport
177
 
        if isinstance(format, LocalGitControlDirFormat):
 
138
        if isinstance(format, LocalGitBzrDirFormat):
178
139
            return self.transport
179
140
        raise bzr_errors.IncompatibleFormat(format, self._format)
180
141
 
181
142
    def get_workingtree_transport(self, format):
182
143
        if format is None:
183
144
            return self.transport
184
 
        if isinstance(format, LocalGitControlDirFormat):
 
145
        if isinstance(format, LocalGitBzrDirFormat):
185
146
            return self.transport
186
147
        raise bzr_errors.IncompatibleFormat(format, self._format)
187
148
 
193
154
            self._lockfiles)
194
155
 
195
156
    def destroy_branch(self, name=None):
196
 
        refname = self._branch_name_to_ref(name)
197
 
        if not refname in self._git.refs:
198
 
            raise bzr_errors.NotBranchError(self.root_transport.base,
199
 
                    bzrdir=self)
200
 
        del self._git.refs[refname]
201
 
 
202
 
    def destroy_repository(self):
203
 
        raise bzr_errors.UnsupportedOperation(self.destroy_repository, self)
204
 
 
205
 
    def destroy_workingtree(self):
206
 
        raise bzr_errors.UnsupportedOperation(self.destroy_workingtree, self)
207
 
 
208
 
    def needs_format_conversion(self, format=None):
209
 
        return not isinstance(self._format, format.__class__)
 
157
        del self._git.refs[self._branch_name_to_ref(name)]
210
158
 
211
159
    def list_branches(self):
212
160
        ret = []
268
216
        finally:
269
217
            f.close()
270
218
        return self.open_workingtree()
271
 
 
272
 
    def find_repository(self):
273
 
        """Find the repository that should be used.
274
 
 
275
 
        This does not require a branch as we use it to find the repo for
276
 
        new branches as well as to hook existing branches up to their
277
 
        repository.
278
 
        """
279
 
        return self.open_repository()
280
 
 
281
 
    def _find_creation_modes(self):
282
 
        """Determine the appropriate modes for files and directories.
283
 
 
284
 
        They're always set to be consistent with the base directory,
285
 
        assuming that this transport allows setting modes.
286
 
        """
287
 
        # TODO: Do we need or want an option (maybe a config setting) to turn
288
 
        # this off or override it for particular locations? -- mbp 20080512
289
 
        if self._mode_check_done:
290
 
            return
291
 
        self._mode_check_done = True
292
 
        try:
293
 
            st = self.transport.stat('.')
294
 
        except TransportNotPossible:
295
 
            self._dir_mode = None
296
 
            self._file_mode = None
297
 
        else:
298
 
            # Check the directory mode, but also make sure the created
299
 
            # directories and files are read-write for this user. This is
300
 
            # mostly a workaround for filesystems which lie about being able to
301
 
            # write to a directory (cygwin & win32)
302
 
            if (st.st_mode & 07777 == 00000):
303
 
                # FTP allows stat but does not return dir/file modes
304
 
                self._dir_mode = None
305
 
                self._file_mode = None
306
 
            else:
307
 
                self._dir_mode = (st.st_mode & 07777) | 00700
308
 
                # Remove the sticky and execute bits for files
309
 
                self._file_mode = self._dir_mode & ~07111
310
 
 
311
 
    def _get_file_mode(self):
312
 
        """Return Unix mode for newly created files, or None.
313
 
        """
314
 
        if not self._mode_check_done:
315
 
            self._find_creation_modes()
316
 
        return self._file_mode
317
 
 
318
 
    def _get_dir_mode(self):
319
 
        """Return Unix mode for newly created directories, or None.
320
 
        """
321
 
        if not self._mode_check_done:
322
 
            self._find_creation_modes()
323
 
        return self._dir_mode
324
 
 
325