, testCase "sync" test_sync
, testCase "union merge regression" test_union_merge_regression
, testCase "adjusted branch merge regression" test_adjusted_branch_merge_regression
+ , testCase "adjusted branch subtree regression" test_adjusted_branch_subtree_regression
, testCase "conflict resolution" test_conflict_resolution
, testCase "conflict resolution (adjusted branch)" test_conflict_resolution_adjusted_branch
, testCase "conflict resolution movein regression" test_conflict_resolution_movein_regression
conflictor `elem` l
@? ("conflictor not present after merge in " ++ what)
+{- Regression test for a bug in adjusted branch syncing code, where adding
+ - a subtree to an existing tree lost files. -}
+test_adjusted_branch_subtree_regression :: Assertion
+test_adjusted_branch_subtree_regression =
+ whenM Annex.AdjustedBranch.isGitVersionSupported $
+ withtmpclonerepo $ \r -> do
+ indir r $ do
+ disconnectOrigin
+ git_annex "upgrade" [] @? "upgrade failed"
+ git_annex "adjust" ["--unlock", "--force"] @? "adjust failed"
+ createDirectoryIfMissing True "a/b/c"
+ writeFile "a/b/c/d" "foo"
+ git_annex "add" ["a/b/c"] @? "add a/b/c failed"
+ git_annex "sync" [] @? "sync failed"
+ createDirectoryIfMissing True "a/b/x"
+ writeFile "a/b/x/y" "foo"
+ git_annex "add" ["a/b/x"] @? "add a/b/x failed"
+ git_annex "sync" [] @? "sync failed"
+ boolSystem "git" [Param "checkout", Param "master"] @? "git checkout master failed"
+ doesFileExist "a/b/x/y" @? ("a/b/x/y missing from master after adjusted branch sync")
+
{- Set up repos as remotes of each other. -}
pair :: FilePath -> FilePath -> Assertion
pair r1 r2 = forM_ [r1, r2] $ \r -> indir r $ do
prevents the change from propigating up from the subtree to the root, and
so it gets left out of the reverse adjusted commit.
-I'm committing a fix, but this needs a test case. Leaving bug open for
-that.
+I'm committing a fix.
With the fix, when I git annex sync in felix's tree, the files that
were getting wrongly deleted are added. The commit summary shows
by the other one, it's grafting in files using their whole path,
to a subtree that is itself part way down that path.
+---
+
+A simpler case of the both bugs is to have a file like a/b/c/d already
+committed and make a commit that adds a/b/x/y, without otherwise modifying
+that tree. On an adjusted branch, `git annex sync` makes a commit of a tree
+that does not include the new file. It may made a commit on top of it for
+the adjusted branch that adds the file back, but the file doesn't reach
+the master branch in this scenario.
+
--[[Joey]]