diff options
-rw-r--r-- | CHANGELOG | 2 | ||||
-rw-r--r-- | Git/Tree.hs | 5 | ||||
-rw-r--r-- | doc/bugs/sync_in_adjusted_branch_deleted_recently_added_files.mdwn | 20 |
3 files changed, 25 insertions, 2 deletions
@@ -26,6 +26,8 @@ git-annex (6.20160924) UNRELEASED; urgency=medium * When auto-upgrading a v3 remote, avoid upgrading to version 6, instead keep it at version 5. * Support using v3 repositories without upgrading them to v5. + * sync: Fix bug in adjusted branch merging that could cause recently + added files to be lost when updating the adjusted branch. -- Joey Hess <id@joeyh.name> Mon, 26 Sep 2016 16:46:19 -0400 diff --git a/Git/Tree.hs b/Git/Tree.hs index cfd5b910d..65c3d713a 100644 --- a/Git/Tree.hs +++ b/Git/Tree.hs @@ -184,10 +184,11 @@ adjustTree adjusttreeitem addtreeitems removefiles r repo = Just TreeObject -> do (sl, modified, is') <- go h False [] (beneathSubTree i) is sl' <- adjustlist h (inTree i) (beneathSubTree i) sl - subtree <- if modified || sl' /= sl + let slmodified = sl' /= sl + subtree <- if modified || slmodified then liftIO $ recordSubTree h $ NewSubTree (LsTree.file i) sl' else return $ RecordedSubTree (LsTree.file i) (LsTree.sha i) [] - let !modified' = modified || wasmodified + let !modified' = modified || slmodified || wasmodified go h modified' (subtree : c) intree is' _ -> error ("unexpected object type \"" ++ LsTree.typeobj i ++ "\"") | otherwise = return (c, wasmodified, i:is) diff --git a/doc/bugs/sync_in_adjusted_branch_deleted_recently_added_files.mdwn b/doc/bugs/sync_in_adjusted_branch_deleted_recently_added_files.mdwn index 8c4425f8b..ce271d8dd 100644 --- a/doc/bugs/sync_in_adjusted_branch_deleted_recently_added_files.mdwn +++ b/doc/bugs/sync_in_adjusted_branch_deleted_recently_added_files.mdwn @@ -57,4 +57,24 @@ addtreeitems are in a deep subdirectory, it seems to not be adding them into the tree. This happens in simpler test cases, so something about this particular tree is breaking the code. +---- + +Ok, think I found the bug. In Git.Tree.adjustTree, it grafts in the new +tree items, but it can forget that it needed to modify the tree, which +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. + +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 +that git thinks those files were renamed: + + rename 2016/xxx xxx und yyy/{ => 2016/xxx xxx und yyy}/zzz/P1230949.JPG (100%) + +This seems wrong. I think this is a separate bug that was hidden +by the other one, it's grafting in files using their whole path, +to a subtree that is itself part way down that path. + --[[Joey]] |