summaryrefslogtreecommitdiff
path: root/Test.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2014-07-10 13:34:53 -0400
committerGravatar Joey Hess <joey@kitenet.net>2014-07-10 13:34:53 -0400
commit2df3b622d9386c853beff3fb0f1f51d84ec32f44 (patch)
tree2abae58b2830705ff18fa52041ee035f09755927 /Test.hs
parentc42733876bcb72d1b4c85de6bac73f1c73b216ad (diff)
add regression test case for 84ffc8f7d265c8a685c1ea081c8a8871c7ee1b44
better late than never
Diffstat (limited to 'Test.hs')
-rw-r--r--Test.hs85
1 files changed, 70 insertions, 15 deletions
diff --git a/Test.hs b/Test.hs
index 303603ee1..4e7d6df75 100644
--- a/Test.hs
+++ b/Test.hs
@@ -218,10 +218,11 @@ unitTests note gettestenv = testGroup ("Unit Tests " ++ note)
, check "conflict resolution" test_conflict_resolution
, check "conflict resolution movein regression" test_conflict_resolution_movein_regression
, check "conflict resolution (mixed directory and file)" test_mixed_conflict_resolution
- , check "conflict resolution symlinks" test_conflict_resolution_symlinks
+ , check "conflict resolution symlink bit" test_conflict_resolution_symlink_bit
, check "conflict resolution (uncommitted local file)" test_uncommitted_conflict_resolution
, check "conflict resolution (removed file)" test_remove_conflict_resolution
- , check "conflict resolution (nonannexed)" test_nonannexed_conflict_resolution
+ , check "conflict resolution (nonannexed file)" test_nonannexed_file_conflict_resolution
+ , check "conflict resolution (nonannexed symlink)" test_nonannexed_symlink_conflict_resolution
, check "map" test_map
, check "uninit" test_uninit
, check "uninit (in git-annex branch)" test_uninit_inbranch
@@ -946,14 +947,14 @@ test_remove_conflict_resolution testenv = do
length v == 1
@? (what ++ " too many variant files in: " ++ show v)
-{- Check merge confalict resolution when a file is annexed in one repo,
- - and checked directly into git in the other repo.
- -
- - This test requires indirect mode to set it up, but tests both direct and
- - indirect mode.
- -}
-test_nonannexed_conflict_resolution :: TestEnv -> Assertion
-test_nonannexed_conflict_resolution testenv = do
+ {- Check merge confalict resolution when a file is annexed in one repo,
+ - and checked directly into git in the other repo.
+ -
+ - This test requires indirect mode to set it up, but tests both direct and
+ - indirect mode.
+ -}
+test_nonannexed_file_conflict_resolution :: TestEnv -> Assertion
+test_nonannexed_file_conflict_resolution testenv = do
check True False
check False False
check True True
@@ -995,6 +996,57 @@ test_nonannexed_conflict_resolution testenv = do
s == Just nonannexed_content
@? (what ++ " wrong content for nonannexed file: " ++ show s)
+
+{- Check merge confalict resolution when a file is annexed in one repo,
+ - and is a non-git-annex symlink in the other repo.
+ -
+ - Test can only run when coreSymlinks is supported, because git needs to
+ - be able to check out the non-git-annex symlink.
+ -}
+test_nonannexed_symlink_conflict_resolution :: TestEnv -> Assertion
+test_nonannexed_symlink_conflict_resolution testenv = do
+ check True False
+ check False False
+ check True True
+ check False True
+ where
+ check inr1 switchdirect = withtmpclonerepo testenv False $ \r1 ->
+ withtmpclonerepo testenv False $ \r2 -> do
+ whenM (checkRepo (Types.coreSymlinks <$> Annex.getGitConfig) r1
+ <&&> isInDirect r1 <&&> isInDirect r2) $ do
+ indir testenv r1 $ do
+ disconnectOrigin
+ writeFile conflictor "conflictor"
+ git_annex testenv "add" [conflictor] @? "add conflicter failed"
+ git_annex testenv "sync" [] @? "sync failed in r1"
+ indir testenv r2 $ do
+ disconnectOrigin
+ createSymbolicLink symlinktarget "conflictor"
+ boolSystem "git" [Params "add", File conflictor] @? "git add conflictor failed"
+ git_annex testenv "sync" [] @? "sync failed in r2"
+ pair testenv r1 r2
+ let l = if inr1 then [r1, r2] else [r2, r1]
+ forM_ l $ \r -> indir testenv r $ do
+ when switchdirect $
+ git_annex testenv "direct" [] @? "failed switching to direct mode"
+ git_annex testenv "sync" [] @? "sync failed"
+ checkmerge ("r1" ++ show switchdirect) r1
+ checkmerge ("r2" ++ show switchdirect) r2
+ conflictor = "conflictor"
+ symlinktarget = "dummy-target"
+ variantprefix = conflictor ++ ".variant"
+ checkmerge what d = do
+ l <- getDirectoryContents d
+ let v = filter (variantprefix `isPrefixOf`) l
+ not (null v)
+ @? (what ++ " conflictor variant file missing in: " ++ show l )
+ length v == 1
+ @? (what ++ " too many variant files in: " ++ show v)
+ conflictor `elem` l @? (what ++ " conflictor file missing in: " ++ show l)
+ s <- catchMaybeIO (readSymbolicLink (d </> conflictor))
+ s == Just symlinktarget
+ @? (what ++ " wrong target for nonannexed symlink: " ++ show s)
+
{- Check merge conflict resolution when there is a local file,
- that is not staged or committed, that conflicts with what's being added
- from the remmote.
@@ -1045,8 +1097,8 @@ test_uncommitted_conflict_resolution testenv = do
{- On Windows/FAT, repeated conflict resolution sometimes
- lost track of whether a file was a symlink.
-}
-test_conflict_resolution_symlinks :: TestEnv -> Assertion
-test_conflict_resolution_symlinks testenv = do
+test_conflict_resolution_symlink_bit :: TestEnv -> Assertion
+test_conflict_resolution_symlink_bit testenv = do
withtmpclonerepo testenv False $ \r1 ->
withtmpclonerepo testenv False $ \r2 -> do
withtmpclonerepo testenv False $ \r3 -> do
@@ -1360,10 +1412,13 @@ intmpclonerepoInDirect testenv a = intmpclonerepo testenv $
Annex.Init.initialize Nothing
Config.isDirect
-isInDirect :: FilePath -> IO Bool
-isInDirect d = do
+checkRepo :: Types.Annex a -> FilePath -> IO a
+checkRepo getval d = do
s <- Annex.new =<< Git.Construct.fromPath d
- not <$> Annex.eval s Config.isDirect
+ Annex.eval s getval
+
+isInDirect :: FilePath -> IO Bool
+isInDirect = checkRepo (not <$> Config.isDirect)
intmpbareclonerepo :: TestEnv -> Assertion -> Assertion
intmpbareclonerepo testenv a = withtmpclonerepo testenv True $ \r -> indir testenv r a