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:
Joey Hess 2017-09-12 18:30:36 -04:00
parent 0fadb620d3
commit f8fd66d3f8
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
3 changed files with 28 additions and 22 deletions

View file

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

View file

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

View file

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