lock index while making index-less commits
Avoids race with another git commit at the same time adjusted branch is being updated.
This commit is contained in:
parent
de4bd97c9d
commit
ef1abda78b
1 changed files with 18 additions and 3 deletions
|
@ -22,6 +22,8 @@ import qualified Git.Ref
|
||||||
import qualified Git.Command
|
import qualified Git.Command
|
||||||
import Git.Tree
|
import Git.Tree
|
||||||
import Git.Env
|
import Git.Env
|
||||||
|
import Git.Index
|
||||||
|
import qualified Git.LockFile
|
||||||
import Annex.CatFile
|
import Annex.CatFile
|
||||||
import Annex.Link
|
import Annex.Link
|
||||||
import Git.HashObject
|
import Git.HashObject
|
||||||
|
@ -86,7 +88,7 @@ originalBranch = fmap getorig <$> inRepo Git.Branch.current
|
||||||
enterAdjustedBranch :: Adjustment -> Annex ()
|
enterAdjustedBranch :: Adjustment -> Annex ()
|
||||||
enterAdjustedBranch adj = go =<< originalBranch
|
enterAdjustedBranch adj = go =<< originalBranch
|
||||||
where
|
where
|
||||||
go (Just origbranch) = do
|
go (Just origbranch) = preventCommits $ do
|
||||||
adjbranch <- adjustBranch adj origbranch
|
adjbranch <- adjustBranch adj origbranch
|
||||||
inRepo $ Git.Command.run
|
inRepo $ Git.Command.run
|
||||||
[ Param "checkout"
|
[ Param "checkout"
|
||||||
|
@ -109,6 +111,19 @@ adjust adj orig = do
|
||||||
liftIO $ hashObjectStop h
|
liftIO $ hashObjectStop h
|
||||||
commitAdjustedTree treesha orig
|
commitAdjustedTree treesha orig
|
||||||
|
|
||||||
|
{- Locks git's index file, preventing git from making a commit, merge,
|
||||||
|
- or otherwise changing the HEAD ref while the action is run.
|
||||||
|
-
|
||||||
|
- Throws an IO exception if the index file is already locked.
|
||||||
|
-}
|
||||||
|
preventCommits :: Annex a -> Annex a
|
||||||
|
preventCommits = bracket setup cleanup . const
|
||||||
|
where
|
||||||
|
setup = do
|
||||||
|
lck <- fromRepo indexFileLock
|
||||||
|
liftIO $ Git.LockFile.openLock lck
|
||||||
|
cleanup lckhandle = liftIO $ Git.LockFile.closeLock lckhandle
|
||||||
|
|
||||||
{- Commits a given adjusted tree, with the provided parent ref.
|
{- Commits a given adjusted tree, with the provided parent ref.
|
||||||
-
|
-
|
||||||
- This should always yield the same value, even if performed in different
|
- This should always yield the same value, even if performed in different
|
||||||
|
@ -129,8 +144,8 @@ commitAdjustedTree treesha parent = go =<< catCommit parent
|
||||||
{- Update the currently checked out adjusted branch, merging the provided
|
{- Update the currently checked out adjusted branch, merging the provided
|
||||||
- branch into it. -}
|
- branch into it. -}
|
||||||
updateAdjustedBranch :: Branch -> (OrigBranch, Adjustment) -> Git.Branch.CommitMode -> Annex Bool
|
updateAdjustedBranch :: Branch -> (OrigBranch, Adjustment) -> Git.Branch.CommitMode -> Annex Bool
|
||||||
updateAdjustedBranch tomerge (origbranch, adj) commitmode =
|
updateAdjustedBranch tomerge (origbranch, adj) commitmode =
|
||||||
go =<< (,)
|
catchBoolIO $ preventCommits $ go =<< (,)
|
||||||
<$> inRepo (Git.Ref.sha tomerge)
|
<$> inRepo (Git.Ref.sha tomerge)
|
||||||
<*> inRepo Git.Branch.current
|
<*> inRepo Git.Branch.current
|
||||||
where
|
where
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue