13
13
# You should have received a copy of the GNU General Public License
14
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
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
17
"""Tests of the dirstate functionality being built for WorkingTreeFormat4."""
745
746
# https://bugs.launchpad.net/bzr/+bug/146176
746
747
# set_state_from_inventory should preserve the stat and hash value for
747
748
# workingtree files that are not changed by the inventory.
749
750
tree = self.make_branch_and_tree('.')
750
751
# depends on the default format using dirstate...
751
752
tree.lock_write()
753
# make a dirstate with some valid hashcache data
754
# make a dirstate with some valid hashcache data
754
755
# file on disk, but that's not needed for this test
755
756
foo_contents = 'contents of foo'
756
757
self.build_tree_contents([('foo', foo_contents)])
776
777
(('', 'foo', 'foo-id',),
777
778
[('f', foo_sha, foo_size, False, foo_packed)]),
778
779
tree._dirstate._get_entry(0, 'foo-id'))
780
781
# extract the inventory, and add something to it
781
782
inv = tree._get_inventory()
782
783
# should see the file we poked in...
1455
1456
There is one parent tree, which has the same shape with the following variations:
1456
1457
b/g in the parent is gone.
1457
1458
b/h in the parent has a different id
1458
b/i is new in the parent
1459
b/i is new in the parent
1459
1460
c is renamed to b/j in the parent
1461
1462
:return: The dirstate, still write-locked.
1616
1617
class InstrumentedDirState(dirstate.DirState):
1617
1618
"""An DirState with instrumented sha1 functionality."""
1619
def __init__(self, path):
1620
super(InstrumentedDirState, self).__init__(path)
1620
def __init__(self, path, sha1_provider):
1621
super(InstrumentedDirState, self).__init__(path, sha1_provider)
1621
1622
self._time_offset = 0
1623
1624
# member is dynamically set in DirState.__init__ to turn on trace
1625
self._sha1_provider = sha1_provider
1624
1626
self._sha1_file = self._sha1_file_and_log
1626
1628
def _sha_cutoff_time(self):
1630
1632
def _sha1_file_and_log(self, abspath):
1631
1633
self._log.append(('sha1', abspath))
1632
return osutils.sha_file_by_name(abspath)
1634
return self._sha1_provider.sha1(abspath)
1634
1636
def _read_link(self, abspath, old_link):
1635
1637
self._log.append(('read_link', abspath, old_link))
2215
2222
def test_unicode_symlink(self):
2216
2223
# In general, the code base doesn't support a target that contains
2217
# non-ascii characters. So we just assert tha
2224
# non-ascii characters. So we just assert tha
2218
2225
inv_entry = inventory.InventoryLink('link-file-id', 'name',
2219
2226
'link-parent-id')
2220
2227
inv_entry.revision = 'link-revision-id'
2221
2228
inv_entry.symlink_target = u'link-target'
2222
2229
details = self.assertDetails(('l', 'link-target', 0, False,
2223
2230
'link-revision-id'), inv_entry)
2233
class TestSHA1Provider(TestCaseInTempDir):
2235
def test_sha1provider_is_an_interface(self):
2236
p = dirstate.SHA1Provider()
2237
self.assertRaises(NotImplementedError, p.sha1, "foo")
2238
self.assertRaises(NotImplementedError, p.stat_and_sha1, "foo")
2240
def test_defaultsha1provider_sha1(self):
2241
text = 'test\r\nwith\nall\rpossible line endings\r\n'
2242
self.build_tree_contents([('foo', text)])
2243
expected_sha = osutils.sha_string(text)
2244
p = dirstate.DefaultSHA1Provider()
2245
self.assertEqual(expected_sha, p.sha1('foo'))
2247
def test_defaultsha1provider_stat_and_sha1(self):
2248
text = 'test\r\nwith\nall\rpossible line endings\r\n'
2249
self.build_tree_contents([('foo', text)])
2250
expected_sha = osutils.sha_string(text)
2251
p = dirstate.DefaultSHA1Provider()
2252
statvalue, sha1 = p.stat_and_sha1('foo')
2253
self.assertTrue(len(statvalue) >= 10)
2254
self.assertEqual(len(text), statvalue.st_size)
2255
self.assertEqual(expected_sha, sha1)