1
# Copyright (C) 2010-2018 Jelmer Vernooij <jelmer@jelmer.uk>
2
# Copyright (C) 2011 Canonical Ltd.
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
# GNU General Public License for more details.
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
"""Tests for Git working trees."""
20
from __future__ import absolute_import
25
from dulwich.objects import (
32
conflicts as _mod_conflicts,
33
workingtree as _mod_workingtree,
35
from ...delta import TreeDelta
36
from ..mapping import (
41
changes_between_git_tree_and_working_copy,
42
tree_delta_from_git_changes,
44
from ..workingtree import (
47
from ...tests import (
49
TestCaseWithTransport,
53
class GitWorkingTreeTests(TestCaseWithTransport):
56
super(GitWorkingTreeTests, self).setUp()
57
self.tree = self.make_branch_and_tree('.', format="git")
59
def test_conflict_list(self):
60
self.assertIsInstance(
61
self.tree.conflicts(),
62
_mod_conflicts.ConflictList)
64
def test_add_conflict(self):
65
self.build_tree(['conflicted'])
66
self.tree.add(['conflicted'])
67
with self.tree.lock_tree_write():
68
self.tree.index[b'conflicted'] = self.tree.index[b'conflicted'][:9] + (FLAG_STAGEMASK, )
69
self.tree._index_dirty = True
70
conflicts = self.tree.conflicts()
71
self.assertEqual(1, len(conflicts))
73
def test_revert_empty(self):
74
self.build_tree(['a'])
76
self.assertTrue(self.tree.is_versioned('a'))
77
self.tree.revert(['a'])
78
self.assertFalse(self.tree.is_versioned('a'))
80
def test_is_ignored_directory(self):
81
self.assertFalse(self.tree.is_ignored('a'))
82
self.build_tree(['a/'])
83
self.assertFalse(self.tree.is_ignored('a'))
84
self.build_tree_contents([('.gitignore', 'a\n')])
85
self.tree._ignoremanager = None
86
self.assertTrue(self.tree.is_ignored('a'))
87
self.build_tree_contents([('.gitignore', 'a/\n')])
88
self.tree._ignoremanager = None
89
self.assertTrue(self.tree.is_ignored('a'))
92
class GitWorkingTreeFileTests(TestCaseWithTransport):
95
super(GitWorkingTreeFileTests, self).setUp()
96
self.tree = self.make_branch_and_tree('actual', format="git")
97
self.build_tree_contents([('linked/',), ('linked/.git', 'gitdir: ../actual/.git')])
98
self.wt = _mod_workingtree.WorkingTree.open('linked')
101
self.build_tree(['linked/somefile'])
102
self.wt.add(["somefile"])
103
self.wt.commit("Add somefile")
106
class TreeDeltaFromGitChangesTests(TestCase):
108
def test_empty(self):
113
tree_delta_from_git_changes(changes, default_mapping,
114
(GitFileIdMap({}, default_mapping),
115
GitFileIdMap({}, default_mapping))))
117
def test_missing(self):
119
delta.removed.append(('a', b'a-id', 'file'))
120
changes = [((b'a', b'a'), (stat.S_IFREG | 0o755, 0), (b'a' * 40, b'a' * 40))]
123
tree_delta_from_git_changes(changes, default_mapping,
124
(GitFileIdMap({u'a': b'a-id'}, default_mapping),
125
GitFileIdMap({u'a': b'a-id'}, default_mapping))))
128
class ChangesBetweenGitTreeAndWorkingCopyTests(TestCaseWithTransport):
131
super(ChangesBetweenGitTreeAndWorkingCopyTests, self).setUp()
132
self.wt = self.make_branch_and_tree('.', format='git')
134
def expectDelta(self, expected_changes,
135
expected_extras=None, want_unversioned=False):
136
store = self.wt.branch.repository._git.object_store
138
tree_id = store[self.wt.branch.repository._git.head()].tree
141
with self.wt.lock_read():
142
changes, extras = changes_between_git_tree_and_working_copy(
143
store, tree_id, self.wt, want_unversioned=want_unversioned)
144
self.assertEqual(expected_changes, list(changes))
145
if expected_extras is None:
146
expected_extras = set()
147
self.assertEqual(set(expected_extras), set(extras))
149
def test_empty(self):
151
[((None, b''), (None, stat.S_IFDIR), (None, Tree().id))])
153
def test_added_file(self):
154
self.build_tree(['a'])
156
a = Blob.from_string(b'contents of a\n')
158
t.add(b"a", stat.S_IFREG | 0o644, a.id)
160
[((None, b''), (None, stat.S_IFDIR), (None, t.id)),
161
((None, b'a'), (None, stat.S_IFREG | 0o644), (None, a.id))])
163
def test_added_unknown_file(self):
164
self.build_tree(['a'])
167
[((None, b''), (None, stat.S_IFDIR), (None, t.id))])
168
a = Blob.from_string(b'contents of a\n')
170
t.add(b"a", stat.S_IFREG | 0o644, a.id)
172
[((None, b''), (None, stat.S_IFDIR), (None, t.id)),
173
((None, b'a'), (None, stat.S_IFREG | 0o644), (None, a.id))],
175
want_unversioned=True)
177
def test_missing_added_file(self):
178
self.build_tree(['a'])
181
a = Blob.from_string(b'contents of a\n')
183
t.add(b"a", 0, ZERO_SHA)
185
[((None, b''), (None, stat.S_IFDIR), (None, t.id)),
186
((None, b'a'), (None, 0), (None, ZERO_SHA))],
189
def test_missing_versioned_file(self):
190
self.build_tree(['a'])
194
a = Blob.from_string(b'contents of a\n')
196
oldt.add(b"a", stat.S_IFREG | 0o644, a.id)
198
newt.add(b"a", 0, ZERO_SHA)
200
[((b'', b''), (stat.S_IFDIR, stat.S_IFDIR), (oldt.id, newt.id)),
201
((b'a', b'a'), (stat.S_IFREG|0o644, 0), (a.id, ZERO_SHA))])
203
def test_versioned_replace_by_dir(self):
204
self.build_tree(['a'])
209
olda = Blob.from_string(b'contents of a\n')
211
oldt.add(b"a", stat.S_IFREG | 0o644, olda.id)
214
newt.add(b"a", stat.S_IFDIR, newa.id)
217
(stat.S_IFDIR, stat.S_IFDIR),
219
((b'a', b'a'), (stat.S_IFREG | 0o644, stat.S_IFDIR), (olda.id, newa.id))
220
], want_unversioned=False)
223
(stat.S_IFDIR, stat.S_IFDIR),
225
((b'a', b'a'), (stat.S_IFREG | 0o644, stat.S_IFDIR), (olda.id, newa.id))
226
], want_unversioned=True)
228
def test_extra(self):
229
self.build_tree(['a'])
230
newa = Blob.from_string(b'contents of a\n')
232
newt.add(b"a", stat.S_IFREG | 0o644, newa.id)
235
(None, stat.S_IFDIR),
237
((None, b'a'), (None, stat.S_IFREG | 0o644), (None, newa.id))
238
], [b'a'], want_unversioned=True)