def test_direct_cfg(path1, path2, path3, path4): with patch.dict('os.environ', {'DATALAD_REPO_DIRECT': 'True'}): # create annex repo in direct mode: with swallow_logs(new_level=logging.DEBUG) as cml: ar = AnnexRepo(path1, create=True) cml.assert_logged("Switching to direct mode", regex=False, level='DEBUG') ok_(ar.is_direct_mode()) # but don't if repo version is 6 (actually, 6 or above): with swallow_logs(new_level=logging.WARNING) as cml: ar = AnnexRepo(path2, create=True, version=6) ok_(not ar.is_direct_mode()) cml.assert_logged("direct mode not available", regex=False, level='WARNING') # explicit parameter `direct` has priority: ar = AnnexRepo(path3, create=True, direct=False) if not ar.is_crippled_fs(): # otherwise forced direct mode ok_(not ar.is_direct_mode()) # don't touch existing repo: ar = AnnexRepo(path2, create=True) if not ar.is_crippled_fs(): # otherwise forced direct mode ok_(not ar.is_direct_mode()) # make sure, value is relevant: with patch.dict('os.environ', {'DATALAD_REPO_DIRECT': '0'}): # don't use direct mode ar = AnnexRepo(path4, create=True) if not ar.is_crippled_fs(): # otherwise forced direct mode ok_(not ar.is_direct_mode())
def test_AnnexRepo_crippled_filesystem(src, dst): # TODO: This test is rudimentary, since platform not really determines filesystem. # For now this should work for the buildbots. Nevertheless: Find a better way to test it. ar = AnnexRepo(dst, src) if on_windows: assert_true(ar.is_crippled_fs(), "Detected non-crippled filesystem on windows.") else: assert_false(ar.is_crippled_fs(), "Detected crippled filesystem on non-windows.")
def test_rotree(d): d2 = opj(d, 'd1', 'd2') # deep nested directory f = opj(d2, 'f1') os.makedirs(d2) with open(f, 'w') as f_: f_.write("LOAD") with swallow_logs(): ar = AnnexRepo(d2) rotree(d) # we shouldn't be able to delete anything UNLESS in "crippled" situation: # root, or filesystem is FAT etc # Theoretically annex should declare FS as crippled when ran as root, but # see http://git-annex.branchable.com/bugs/decides_that_FS_is_crippled_ # under_cowbuilder___40__symlinks_supported_etc__41__/#comment-60c3cbe2710d6865fb9b7d6e247cd7aa # so explicit 'or' if not (ar.is_crippled_fs() or (os.getuid() == 0)): assert_raises(OSError, os.unlink, f) # OK to use os.unlink assert_raises(OSError, unlink, f) # and even with waiting and trying! assert_raises(OSError, shutil.rmtree, d) # but file should still be accessible with open(f) as f_: eq_(f_.read(), "LOAD") # make it RW rotree(d, False) unlink(f) shutil.rmtree(d)
def test_AnnexRepo_set_direct_mode(src, dst): ar = AnnexRepo(dst, src) ar.set_direct_mode(True) assert_true(ar.is_direct_mode(), "Switching to direct mode failed.") if ar.is_crippled_fs(): assert_raises(CommandNotAvailableError, ar.set_direct_mode, False) assert_true(ar.is_direct_mode(), "Indirect mode on crippled fs detected. Shouldn't be possible.") else: ar.set_direct_mode(False) assert_false(ar.is_direct_mode(), "Switching to indirect mode failed.")
def test_AnnexRepo_set_direct_mode(src, dst): ar = AnnexRepo(dst, src) ar.set_direct_mode(True) assert_true(ar.is_direct_mode(), "Switching to direct mode failed.") if ar.is_crippled_fs(): assert_raises(CommandNotAvailableError, ar.set_direct_mode, False) assert_true( ar.is_direct_mode(), "Indirect mode on crippled fs detected. Shouldn't be possible.") else: ar.set_direct_mode(False) assert_false(ar.is_direct_mode(), "Switching to indirect mode failed.")