add back non-preferred files to imported tree
Prevents merging the import from deleting the non-preferred files from the branch it's merged into. adjustTree previously appended the new list of items to the old, which could result in it generating a tree with multiple files with the same name. That is not good and confuses some parts of git. Gave it a function to resolve such conflicts. That allowed dealing with the problem of what happens when the import contains some files (or subtrees) with the same name as files that were filtered out of the export. The files from the import win.
This commit is contained in:
parent
7d177b78e4
commit
97fd9da6e7
9 changed files with 185 additions and 47 deletions
|
@ -442,19 +442,29 @@ removeEmptyDirectories r db loc ks
|
|||
-- expression.
|
||||
newtype PreferredFiltered t = PreferredFiltered t
|
||||
|
||||
-- | Filters the tree to files that are preferred content of the remote.
|
||||
--
|
||||
-- A log is written with files that were filtered out, so they can be added
|
||||
-- back in when importing from the remote.
|
||||
filterPreferredContent :: Remote -> Git.Ref -> Annex (PreferredFiltered Git.Ref)
|
||||
filterPreferredContent r tree = do
|
||||
filterPreferredContent r tree = logExportExcluded (uuid r) $ \logwriter -> do
|
||||
m <- preferredContentMap
|
||||
case M.lookup (uuid r) m of
|
||||
Just matcher | not (isEmpty matcher) ->
|
||||
PreferredFiltered <$> go matcher
|
||||
Just matcher | not (isEmpty matcher) -> do
|
||||
PreferredFiltered <$> go matcher logwriter
|
||||
_ -> return (PreferredFiltered tree)
|
||||
where
|
||||
go matcher = do
|
||||
go matcher logwriter = do
|
||||
g <- Annex.gitRepo
|
||||
Git.Tree.adjustTree (checkmatcher matcher) [] [] tree g
|
||||
Git.Tree.adjustTree
|
||||
(checkmatcher matcher logwriter)
|
||||
[]
|
||||
(\_old new -> new)
|
||||
[]
|
||||
tree
|
||||
g
|
||||
|
||||
checkmatcher matcher ti@(Git.Tree.TreeItem topf _ sha) =
|
||||
checkmatcher matcher logwriter ti@(Git.Tree.TreeItem topf _ sha) =
|
||||
catKey sha >>= \case
|
||||
Just k -> do
|
||||
-- Match filename relative to the
|
||||
|
@ -464,7 +474,9 @@ filterPreferredContent r tree = do
|
|||
let mi = MatchingKey k af
|
||||
ifM (checkMatcher' matcher mi mempty)
|
||||
( return (Just ti)
|
||||
, return Nothing
|
||||
, do
|
||||
() <- liftIO $ logwriter ti
|
||||
return Nothing
|
||||
)
|
||||
-- Always export non-annexed files.
|
||||
Nothing -> return (Just ti)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue