sync: Fix bug in adjusted branch merging that could cause recently added files to be lost when updating the adjusted branch.

The modification flag was not being set when making modifications deep
in a tree, so parent trees were not updated to contain the modified tree.

Seems to have exposed another bug where the wrong filename gets grafted in.

This commit was sponsored by Brock Spratlen on Patreon.
This commit is contained in:
Joey Hess 2016-10-10 15:00:45 -04:00
parent d2527c421c
commit b82c3e0783
No known key found for this signature in database
GPG key ID: C910D9222512E3C7
3 changed files with 25 additions and 2 deletions

View file

@ -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

View file

@ -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)

View file

@ -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]]