/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
1
# Copyright (C) 2008 Jelmer Vernooij <jelmer@samba.org>
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
0.200.381 by Jelmer Vernooij
Support working trees properly, status and ls.
17
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
18
"""An adapter between a Git index and a Bazaar Working Tree"""
19
0.200.381 by Jelmer Vernooij
Support working trees properly, status and ls.
20
0.200.385 by Jelmer Vernooij
Cope with removed files.
21
from cStringIO import (
22
    StringIO,
23
    )
0.200.292 by Jelmer Vernooij
Fix formatting.
24
from dulwich.index import (
25
    Index,
26
    )
0.200.383 by Jelmer Vernooij
Simplify, support rewriting index based on inventory.
27
from dulwich.objects import (
28
    Blob,
29
    )
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
30
import os
0.200.384 by Jelmer Vernooij
Fix reading of inventory from index.
31
import stat
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
32
33
from bzrlib import (
0.200.382 by Jelmer Vernooij
Support flushing index.
34
    errors,
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
35
    inventory,
36
    lockable_files,
37
    lockdir,
0.200.381 by Jelmer Vernooij
Support working trees properly, status and ls.
38
    osutils,
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
39
    transport,
40
    urlutils,
41
    workingtree,
42
    )
0.200.381 by Jelmer Vernooij
Support working trees properly, status and ls.
43
from bzrlib.decorators import (
44
    needs_read_lock,
45
    needs_write_lock,
46
    )
47
48
0.200.401 by Jelmer Vernooij
Move working tree inventory code to inventory.
49
from bzrlib.plugins.git.inventory import (
50
    GitIndexInventory,
51
    )
0.200.381 by Jelmer Vernooij
Support working trees properly, status and ls.
52
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
53
54
class GitWorkingTree(workingtree.WorkingTree):
55
    """A Git working tree."""
56
57
    def __init__(self, bzrdir, repo, branch):
0.200.379 by Jelmer Vernooij
Re-enable working tree support.
58
        self.basedir = bzrdir.root_transport.local_abspath('.')
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
59
        self.bzrdir = bzrdir
60
        self.repository = repo
0.200.384 by Jelmer Vernooij
Fix reading of inventory from index.
61
        self.mapping = self.repository.get_mapping()
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
62
        self._branch = branch
63
        self._transport = bzrdir.transport
64
0.200.381 by Jelmer Vernooij
Support working trees properly, status and ls.
65
        self.controldir = urlutils.join(self.repository._git._controldir, 'bzr')
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
66
67
        try:
68
            os.makedirs(self.controldir)
69
            os.makedirs(os.path.join(self.controldir, 'lock'))
70
        except OSError:
71
            pass
72
73
        self._control_files = lockable_files.LockableFiles(
74
            transport.get_transport(self.controldir), 'lock', lockdir.LockDir)
75
76
        self._format = GitWorkingTreeFormat()
77
0.200.382 by Jelmer Vernooij
Support flushing index.
78
        self.index_path = os.path.join(self.repository._git.controldir(), 
79
                                       "index")
80
        self.index = Index(self.index_path)
0.200.239 by Jelmer Vernooij
Provide views.
81
        self.views = self._make_views()
0.200.381 by Jelmer Vernooij
Support working trees properly, status and ls.
82
        self._detect_case_handling()
0.200.173 by Jelmer Vernooij
Merge changes, open index.
83
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
84
    def unlock(self):
0.200.224 by Jelmer Vernooij
Fix working tree locking.
85
        # non-implementation specific cleanup
86
        self._cleanup()
87
88
        # reverse order of locking.
89
        try:
90
            return self._control_files.unlock()
91
        finally:
92
            self.branch.unlock()
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
93
94
    def is_control_filename(self, path):
95
        return os.path.basename(path) == ".git"
96
0.200.383 by Jelmer Vernooij
Simplify, support rewriting index based on inventory.
97
    def _rewrite_index(self):
98
        self.index.clear()
99
        for path, entry in self._inventory.iter_entries():
100
            if entry.kind == "directory":
101
                # Git indexes don't contain directories
102
                continue
103
            if entry.kind == "file":
104
                blob = Blob()
0.200.385 by Jelmer Vernooij
Cope with removed files.
105
                try:
106
                    file, stat_val = self.get_file_with_stat(entry.file_id, path)
107
                except (errors.NoSuchFile, IOError):
108
                    # TODO: Rather than come up with something here, use the old index
109
                    file = StringIO()
110
                    stat_val = (0, 0, 0, 0, stat.S_IFREG | 0644, 0, 0, 0, 0, 0)
0.200.383 by Jelmer Vernooij
Simplify, support rewriting index based on inventory.
111
                blob._text = file.read()
112
            elif entry.kind == "symlink":
113
                blob = Blob()
114
                stat_val = os.stat(self.abspath(path))
115
                blob._text = entry.symlink_target
116
            # Add object to the repository if it didn't exist yet
117
            if not blob.id in self.repository._git.object_store:
118
                self.repository._git.object_store.add_object(blob)
119
            # Add an entry to the index or update the existing entry
120
            (mode, ino, dev, links, uid, gid, size, atime, mtime, ctime) = stat_val
121
            flags = 0
0.200.385 by Jelmer Vernooij
Cope with removed files.
122
            self.index[path.encode("utf-8")] = (ctime, mtime, ino, dev, mode, uid, gid, size, blob.id, flags)
0.200.383 by Jelmer Vernooij
Simplify, support rewriting index based on inventory.
123
0.200.382 by Jelmer Vernooij
Support flushing index.
124
    def flush(self):
125
        # TODO: Maybe this should only write on dirty ?
126
        if self._control_files._lock_mode != 'w':
127
            raise errors.NotWriteLocked(self)
0.200.383 by Jelmer Vernooij
Simplify, support rewriting index based on inventory.
128
        self._rewrite_index()           
0.200.385 by Jelmer Vernooij
Cope with removed files.
129
        self.index.write()
0.200.382 by Jelmer Vernooij
Support flushing index.
130
        self._inventory_is_modified = False
131
0.200.379 by Jelmer Vernooij
Re-enable working tree support.
132
    def _reset_data(self):
0.200.381 by Jelmer Vernooij
Support working trees properly, status and ls.
133
        self._inventory_is_modified = False
0.200.384 by Jelmer Vernooij
Fix reading of inventory from index.
134
        basis_inv = self.repository.get_inventory(self.mapping.revision_id_foreign_to_bzr(self.repository._git.head()))
0.200.401 by Jelmer Vernooij
Move working tree inventory code to inventory.
135
        result = GitIndexInventory(basis_inv, self.mapping, self.index)
0.200.381 by Jelmer Vernooij
Support working trees properly, status and ls.
136
        self._set_inventory(result, dirty=False)
0.200.379 by Jelmer Vernooij
Re-enable working tree support.
137
0.200.381 by Jelmer Vernooij
Support working trees properly, status and ls.
138
    @needs_read_lock
139
    def get_file_sha1(self, file_id, path=None, stat_value=None):
140
        if not path:
141
            path = self._inventory.id2path(file_id)
0.200.383 by Jelmer Vernooij
Simplify, support rewriting index based on inventory.
142
        return osutils.sha_file_by_name(self.abspath(path).encode(osutils._fs_enc))
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
143
144
145
class GitWorkingTreeFormat(workingtree.WorkingTreeFormat):
146
147
    def get_format_description(self):
148
        return "Git Working Tree"