120
107
except (errors.NoSuchFile, IOError):
121
108
# TODO: Rather than come up with something here, use the old index
122
109
file = StringIO()
123
from posix import stat_result
124
stat_val = stat_result((stat.S_IFREG | 0644, 0, 0, 0, 0, 0, 0, 0, 0, 0))
125
blob.set_raw_string(file.read())
110
stat_val = (0, 0, 0, 0, stat.S_IFREG | 0644, 0, 0, 0, 0, 0)
111
blob._text = file.read()
126
112
elif entry.kind == "symlink":
129
stat_val = os.lstat(self.abspath(path))
130
except (errors.NoSuchFile, OSError):
131
# TODO: Rather than come up with something here, use the
133
from posix import stat_result
134
stat_val = stat_result((stat.S_IFLNK, 0, 0, 0, 0, 0, 0, 0, 0, 0))
135
blob.set_raw_string(entry.symlink_target)
137
raise AssertionError("unknown kind '%s'" % entry.kind)
114
stat_val = os.stat(self.abspath(path))
115
blob._text = entry.symlink_target
138
116
# Add object to the repository if it didn't exist yet
139
117
if not blob.id in self.repository._git.object_store:
140
118
self.repository._git.object_store.add_object(blob)
141
119
# Add an entry to the index or update the existing entry
143
self.index[path.encode("utf-8")] = (stat_val.st_ctime, stat_val.st_mtime, stat_val.st_dev, stat_val.st_ino, stat_val.st_mode, stat_val.st_uid, stat_val.st_gid, stat_val.st_size, blob.id, flags)
120
(mode, ino, dev, links, uid, gid, size, atime, mtime, ctime) = stat_val
122
self.index[path.encode("utf-8")] = (ctime, mtime, ino, dev, mode, uid, gid, size, blob.id, flags)
146
125
# TODO: Maybe this should only write on dirty ?
167
146
self._ignoreset = ignore_globs
168
147
return ignore_globs
170
def set_last_revision(self, revid):
171
self._change_last_revision(revid)
173
149
def _reset_data(self):
174
150
self._inventory_is_modified = False
175
151
basis_inv = self.repository.get_inventory(self.mapping.revision_id_foreign_to_bzr(self.repository._git.head()))
176
result = GitIndexInventory(basis_inv, self.mapping, self.index,
177
self.repository._git.object_store)
152
result = GitIndexInventory(basis_inv, self.mapping, self.index)
178
153
self._set_inventory(result, dirty=False)
181
156
def get_file_sha1(self, file_id, path=None, stat_value=None):
183
158
path = self._inventory.id2path(file_id)
185
return osutils.sha_file_by_name(self.abspath(path).encode(osutils._fs_enc))
186
except OSError, (num, msg):
187
if num in (errno.EISDIR, errno.ENOENT):
191
def revision_tree(self, revid):
192
return self.repository.revision_tree(revid)
159
return osutils.sha_file_by_name(self.abspath(path).encode(osutils._fs_enc))
200
162
class GitWorkingTreeFormat(workingtree.WorkingTreeFormat):
203
def _matchingbzrdir(self):
204
from bzrlib.plugins.git import LocalGitBzrDirFormat
205
return LocalGitBzrDirFormat()
207
164
def get_format_description(self):
208
165
return "Git Working Tree"
211
class InterIndexGitTree(tree.InterTree):
212
"""InterTree that works between a Git revision tree and an index."""
214
def __init__(self, source, target):
215
super(InterIndexGitTree, self).__init__(source, target)
216
self._index = target.index
219
def is_compatible(cls, source, target):
220
from bzrlib.plugins.git.repository import GitRevisionTree
221
return (isinstance(source, GitRevisionTree) and
222
isinstance(target, GitWorkingTree))
224
def compare(self, want_unchanged=False, specific_files=None,
225
extra_trees=None, require_versioned=False, include_root=False,
226
want_unversioned=False):
227
changes = self._index.changes_from_tree(
228
self.source._repository._git.object_store, self.source.tree,
229
want_unchanged=want_unchanged)
230
ret = tree_delta_from_git_changes(changes, self.target.mapping,
231
specific_file=specific_files, require_versioned=require_versioned)
233
for e in self.target.extras():
234
ret.unversioned.append((e, None, osutils.file_kind(self.target.abspath(e))))
237
def iter_changes(self, include_unchanged=False, specific_files=None,
238
pb=None, extra_trees=[], require_versioned=True, want_unversioned=False):
239
changes = self._index.changes_from_tree(
240
self.source._repository._git.object_store, self.source.tree,
241
want_unchanged=include_unchanged)
242
# FIXME: Handle want_unversioned
243
return changes_from_git_changes(changes, self.target.mapping,
244
specific_file=specific_files)
246
tree.InterTree.register_optimiser(InterIndexGitTree)