fix compaction of export.log
It was not getting old lines removed, because the tree graft confused the updater, so it union merged from the previous git-annex branch, which still contained the old lines. Fixed by carefully using setIndexSha. This commit was supported by the NSF-funded DataLad project.
This commit is contained in:
parent
0fadb620d3
commit
f8fd66d3f8
3 changed files with 28 additions and 22 deletions
|
@ -1,6 +1,6 @@
|
||||||
{- management of the git-annex branch
|
{- management of the git-annex branch
|
||||||
-
|
-
|
||||||
- Copyright 2011-2016 Joey Hess <id@joeyh.name>
|
- Copyright 2011-2017 Joey Hess <id@joeyh.name>
|
||||||
-
|
-
|
||||||
- Licensed under the GNU GPL version 3 or higher.
|
- Licensed under the GNU GPL version 3 or higher.
|
||||||
-}
|
-}
|
||||||
|
@ -23,8 +23,9 @@ module Annex.Branch (
|
||||||
forceCommit,
|
forceCommit,
|
||||||
getBranch,
|
getBranch,
|
||||||
files,
|
files,
|
||||||
withIndex,
|
graftTreeish,
|
||||||
performTransitions,
|
performTransitions,
|
||||||
|
withIndex,
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import qualified Data.ByteString.Lazy as L
|
import qualified Data.ByteString.Lazy as L
|
||||||
|
@ -46,6 +47,7 @@ import qualified Git.Sha
|
||||||
import qualified Git.Branch
|
import qualified Git.Branch
|
||||||
import qualified Git.UnionMerge
|
import qualified Git.UnionMerge
|
||||||
import qualified Git.UpdateIndex
|
import qualified Git.UpdateIndex
|
||||||
|
import qualified Git.Tree
|
||||||
import Git.LsTree (lsTreeParams)
|
import Git.LsTree (lsTreeParams)
|
||||||
import qualified Git.HashObject
|
import qualified Git.HashObject
|
||||||
import Annex.HashObject
|
import Annex.HashObject
|
||||||
|
@ -614,3 +616,25 @@ getMergedRefs' = do
|
||||||
parse l =
|
parse l =
|
||||||
let (s, b) = separate (== '\t') l
|
let (s, b) = separate (== '\t') l
|
||||||
in (Ref s, Ref b)
|
in (Ref s, Ref b)
|
||||||
|
|
||||||
|
{- Grafts a treeish into the branch at the specified location,
|
||||||
|
- and then removes it. This ensures that the treeish won't get garbage
|
||||||
|
- collected, and will always be available as long as the git-annex branch
|
||||||
|
- is available. -}
|
||||||
|
graftTreeish :: Git.Ref -> TopFilePath -> Annex ()
|
||||||
|
graftTreeish treeish graftpoint = lockJournal $ \jl -> do
|
||||||
|
branchref <- getBranch
|
||||||
|
updateIndex jl branchref
|
||||||
|
Git.Tree.Tree t <- inRepo $ Git.Tree.getTree branchref
|
||||||
|
t' <- inRepo $ Git.Tree.recordTree $ Git.Tree.Tree $
|
||||||
|
Git.Tree.RecordedSubTree graftpoint treeish [] : t
|
||||||
|
c <- inRepo $ Git.Branch.commitTree Git.Branch.AutomaticCommit
|
||||||
|
"graft" [branchref] t'
|
||||||
|
origtree <- inRepo $ Git.Tree.recordTree (Git.Tree.Tree t)
|
||||||
|
c' <- inRepo $ Git.Branch.commitTree Git.Branch.AutomaticCommit
|
||||||
|
"graft cleanup" [c] origtree
|
||||||
|
inRepo $ Git.Branch.update' fullname c'
|
||||||
|
-- The tree in c' is the same as the tree in branchref,
|
||||||
|
-- and the index was updated to that above, so it's safe to
|
||||||
|
-- say that the index contains c'.
|
||||||
|
setIndexSha c'
|
||||||
|
|
|
@ -11,6 +11,7 @@ import qualified Data.Map as M
|
||||||
|
|
||||||
import Annex.Common
|
import Annex.Common
|
||||||
import qualified Annex.Branch
|
import qualified Annex.Branch
|
||||||
|
import Annex.Journal
|
||||||
import qualified Git
|
import qualified Git
|
||||||
import qualified Git.Branch
|
import qualified Git.Branch
|
||||||
import Git.Tree
|
import Git.Tree
|
||||||
|
@ -97,7 +98,7 @@ recordExportBeginning remoteuuid newtree = do
|
||||||
showExportLog
|
showExportLog
|
||||||
. changeMapLog c ep new
|
. changeMapLog c ep new
|
||||||
. parseExportLog
|
. parseExportLog
|
||||||
graftTreeish newtree
|
Annex.Branch.graftTreeish newtree (asTopFilePath "export.tree")
|
||||||
|
|
||||||
parseExportLog :: String -> MapLog ExportParticipants Exported
|
parseExportLog :: String -> MapLog ExportParticipants Exported
|
||||||
parseExportLog = parseMapLog parseExportParticipants parseExported
|
parseExportLog = parseMapLog parseExportParticipants parseExported
|
||||||
|
@ -125,20 +126,3 @@ parseExported :: String -> Maybe Exported
|
||||||
parseExported s = case words s of
|
parseExported s = case words s of
|
||||||
(et:it) -> Just $ Exported (Git.Ref et) (map Git.Ref it)
|
(et:it) -> Just $ Exported (Git.Ref et) (map Git.Ref it)
|
||||||
_ -> Nothing
|
_ -> Nothing
|
||||||
|
|
||||||
-- To prevent git-annex branch merge conflicts, the treeish is
|
|
||||||
-- first grafted in and then removed in a subsequent commit.
|
|
||||||
graftTreeish :: Git.Ref -> Annex ()
|
|
||||||
graftTreeish treeish = do
|
|
||||||
branchref <- Annex.Branch.getBranch
|
|
||||||
Tree t <- inRepo $ getTree branchref
|
|
||||||
t' <- inRepo $ recordTree $ Tree $
|
|
||||||
RecordedSubTree (asTopFilePath graftpoint) treeish [] : t
|
|
||||||
commit <- inRepo $ Git.Branch.commitTree Git.Branch.AutomaticCommit
|
|
||||||
"export tree" [branchref] t'
|
|
||||||
origtree <- inRepo $ recordTree (Tree t)
|
|
||||||
commit' <- inRepo $ Git.Branch.commitTree Git.Branch.AutomaticCommit
|
|
||||||
"export tree cleanup" [commit] origtree
|
|
||||||
inRepo $ Git.Branch.update' Annex.Branch.fullname commit'
|
|
||||||
where
|
|
||||||
graftpoint = "export.tree"
|
|
||||||
|
|
|
@ -17,7 +17,6 @@ there need to be a new interface in supported remotes?
|
||||||
|
|
||||||
Work is in progress. Todo list:
|
Work is in progress. Todo list:
|
||||||
|
|
||||||
* Compact the export.log to remove old entries.
|
|
||||||
* `git annex get --from export` works in the repo that exported to it,
|
* `git annex get --from export` works in the repo that exported to it,
|
||||||
but in another repo, the export db won't be populated, so it won't work.
|
but in another repo, the export db won't be populated, so it won't work.
|
||||||
Maybe just show a useful error message in this case?
|
Maybe just show a useful error message in this case?
|
||||||
|
@ -25,7 +24,6 @@ Work is in progress. Todo list:
|
||||||
export from another repository also doesn't work right, because the
|
export from another repository also doesn't work right, because the
|
||||||
export database is not populated. So, seems that the export database needs
|
export database is not populated. So, seems that the export database needs
|
||||||
to get populated based on the export log in these cases.
|
to get populated based on the export log in these cases.
|
||||||
* Support export to aditional special remotes (webdav etc)
|
|
||||||
* Support export in the assistant (when eg setting up a S3 special remote).
|
* Support export in the assistant (when eg setting up a S3 special remote).
|
||||||
Would need git-annex sync to export to the master tree?
|
Would need git-annex sync to export to the master tree?
|
||||||
This is similar to the little-used preferreddir= preferred content
|
This is similar to the little-used preferreddir= preferred content
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue