direct mode merging works!
Automatic merge resoltion code needs to be fixed to preserve objects from direct mode files.
This commit is contained in:
parent
d62a58b9c8
commit
53dbcce645
6 changed files with 135 additions and 62 deletions
|
@ -13,8 +13,7 @@ import qualified Git
|
|||
import qualified Git.Command
|
||||
import qualified Git.LsFiles
|
||||
import Config
|
||||
import Annex.Content
|
||||
import Annex.Content.Direct
|
||||
import Annex.Direct
|
||||
|
||||
def :: [Command]
|
||||
def = [command "direct" paramNothing seek "switch repository to direct mode"]
|
||||
|
@ -41,25 +40,13 @@ perform = do
|
|||
void $ liftIO clean
|
||||
next cleanup
|
||||
where
|
||||
{- Walk tree from top and move all present objects to the
|
||||
- files that link to them, while updating direct mode mappings. -}
|
||||
go = whenAnnexed $ \f (k, _) -> do
|
||||
loc <- inRepo $ gitAnnexLocation k
|
||||
createContentDir loc -- thaws directory too
|
||||
locs <- filter (/= f) <$> addAssociatedFile k f
|
||||
case locs of
|
||||
[] -> whenM (liftIO $ doesFileExist loc) $ do
|
||||
{- Move content from annex to direct file. -}
|
||||
r <- toDirect k f
|
||||
case r of
|
||||
Nothing -> noop
|
||||
Just a -> do
|
||||
showStart "direct" f
|
||||
updateCache k loc
|
||||
thawContent loc
|
||||
liftIO $ replaceFile f $ moveFile loc
|
||||
showEndOk
|
||||
(loc':_) -> do
|
||||
{- Another direct file has the content, so
|
||||
- hard link to it. -}
|
||||
showStart "direct" f
|
||||
liftIO $ replaceFile f $ createLink loc'
|
||||
a
|
||||
showEndOk
|
||||
return Nothing
|
||||
|
||||
|
|
|
@ -15,7 +15,6 @@ import qualified Annex
|
|||
import qualified Annex.Branch
|
||||
import qualified Annex.Queue
|
||||
import Annex.Content
|
||||
import Annex.Content.Direct
|
||||
import Annex.Direct
|
||||
import Annex.CatFile
|
||||
import qualified Git.Command
|
||||
|
@ -179,31 +178,30 @@ mergeAnnex = do
|
|||
void $ Annex.Branch.forceUpdate
|
||||
stop
|
||||
|
||||
{- Merges from a branch into the current branch.
|
||||
-
|
||||
- In direct mode, updates associated files mappings for the files that
|
||||
- were changed by the merge. -}
|
||||
{- Merges from a branch into the current branch. -}
|
||||
mergeFrom :: Git.Ref -> Annex Bool
|
||||
mergeFrom branch = ifM isDirect
|
||||
( maybe go godirect =<< inRepo Git.Branch.current
|
||||
, go
|
||||
)
|
||||
mergeFrom branch = do
|
||||
showOutput
|
||||
ifM isDirect
|
||||
( maybe go godirect =<< inRepo Git.Branch.current
|
||||
, go
|
||||
)
|
||||
where
|
||||
go = do
|
||||
showOutput
|
||||
ok <- inRepo $ Git.Merge.mergeNonInteractive branch
|
||||
if ok
|
||||
then return ok
|
||||
else resolveMerge
|
||||
go = runmerge $ inRepo $ Git.Merge.mergeNonInteractive branch
|
||||
godirect currbranch = do
|
||||
old <- inRepo $ Git.Ref.sha currbranch
|
||||
r <- go
|
||||
d <- fromRepo gitAnnexMergeDir
|
||||
r <- runmerge $ inRepo $ mergeDirect d branch
|
||||
new <- inRepo $ Git.Ref.sha currbranch
|
||||
case (old, new) of
|
||||
(Just oldsha, Just newsha) -> do
|
||||
updateAssociatedFiles oldsha newsha
|
||||
(Just oldsha, Just newsha) ->
|
||||
mergeDirectCleanup d oldsha newsha
|
||||
_ -> noop
|
||||
return r
|
||||
runmerge a = ifM (a)
|
||||
( return True
|
||||
, resolveMerge
|
||||
)
|
||||
|
||||
{- Resolves a conflicted merge. It's important that any conflicts be
|
||||
- resolved in a way that itself avoids later merge conflicts, since
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue