make sync update --unlock-present branch

This commit is contained in:
Joey Hess 2020-11-13 14:58:42 -04:00
parent e66b7d2e1b
commit ccfa9b2dc4
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
3 changed files with 47 additions and 36 deletions

View file

@ -13,6 +13,7 @@ module Annex.AdjustedBranch (
PresenceAdjustment(..),
LinkPresentAdjustment(..),
adjustmentHidesFiles,
adjustmentIsStable,
OrigBranch,
AdjBranch(..),
originalToAdjusted,
@ -66,9 +67,11 @@ import qualified Data.Map as M
import qualified Data.ByteString as S
import qualified System.FilePath.ByteString as P
-- How to perform various adjustments to a TreeItem.
class AdjustTreeItem t where
-- How to perform various adjustments to a TreeItem.
adjustTreeItem :: t -> TreeItem -> Annex (Maybe TreeItem)
-- Will adjusting a given tree always yield the same adjusted tree?
adjustmentIsStable :: t -> Bool
instance AdjustTreeItem Adjustment where
adjustTreeItem (LinkAdjustment l) t = adjustTreeItem l t
@ -79,6 +82,10 @@ instance AdjustTreeItem Adjustment where
Just t' -> adjustTreeItem l t'
adjustTreeItem (LinkPresentAdjustment l) t = adjustTreeItem l t
adjustmentIsStable (LinkAdjustment l) = adjustmentIsStable l
adjustmentIsStable (PresenceAdjustment p _) = adjustmentIsStable p
adjustmentIsStable (LinkPresentAdjustment l) = adjustmentIsStable l
instance AdjustTreeItem LinkAdjustment where
adjustTreeItem UnlockAdjustment =
ifSymlink adjustToPointer noAdjust
@ -88,6 +95,8 @@ instance AdjustTreeItem LinkAdjustment where
ifSymlink adjustToSymlink noAdjust
adjustTreeItem UnFixAdjustment =
ifSymlink (adjustToSymlink' gitAnnexLinkCanonical) noAdjust
adjustmentIsStable _ = True
instance AdjustTreeItem PresenceAdjustment where
adjustTreeItem HideMissingAdjustment =
@ -95,6 +104,9 @@ instance AdjustTreeItem PresenceAdjustment where
adjustTreeItem ShowMissingAdjustment =
noAdjust
adjustmentIsStable HideMissingAdjustment = False
adjustmentIsStable ShowMissingAdjustment = True
instance AdjustTreeItem LinkPresentAdjustment where
adjustTreeItem UnlockPresentAdjustment =
ifPresent adjustToPointer adjustToSymlink
@ -106,6 +118,9 @@ instance AdjustTreeItem LinkPresentAdjustment where
-- content is not present.
ifSymlink noAdjust adjustToSymlink
adjustmentIsStable UnlockPresentAdjustment = False
adjustmentIsStable LockPresentAdjustment = True
ifSymlink
:: (TreeItem -> Annex a)
-> (TreeItem -> Annex a)
@ -222,44 +237,41 @@ checkoutAdjustedBranch (AdjBranch b) checkoutparams = do
] ++ checkoutparams
{- Already in a branch with this adjustment, but the user asked to enter it
- again. This should have the same result as checking out the original branch,
- deleting and rebuilding the adjusted branch, and then checking it out.
- again. This should have the same result as propagating any commits
- back to the original branch, checking out the original branch, deleting
- and rebuilding the adjusted branch, and then checking it out.
- But, it can be implemented more efficiently than that.
-}
updateAdjustedBranch :: Adjustment -> AdjBranch -> OrigBranch -> Annex Bool
updateAdjustedBranch adj@(PresenceAdjustment _ _) currbranch origbranch =
updateAdjustedBranch' adj currbranch origbranch
updateAdjustedBranch adj@(LinkPresentAdjustment _) currbranch origbranch =
updateAdjustedBranch' adj currbranch origbranch
updateAdjustedBranch adj@(LinkAdjustment _) _ origbranch =
preventCommits $ \commitlck -> do
-- Not really needed here, but done for consistency.
updateAdjustedBranch adj (AdjBranch currbranch) origbranch
| not (adjustmentIsStable adj) = do
b <- preventCommits $ \commitlck -> do
-- Avoid losing any commits that the adjusted branch
-- has that have not yet been propigated back to the
-- origbranch.
_ <- propigateAdjustedCommits' origbranch adj commitlck
-- Git normally won't do anything when asked to check
-- out the currently checked out branch, even when its
-- ref has changed. Work around this by writing a raw
-- sha to .git/HEAD.
inRepo (Git.Ref.sha currbranch) >>= \case
Just headsha -> inRepo $ \r ->
writeFile (Git.Ref.headFile r) (fromRef headsha)
_ -> noop
adjustBranch adj origbranch
-- Make git checkout quiet to avoid warnings about
-- disconnected branch tips being lost.
checkoutAdjustedBranch b [Param "--quiet"]
| otherwise = preventCommits $ \commitlck -> do
-- Done for consistency.
_ <- propigateAdjustedCommits' origbranch adj commitlck
-- No need to do anything else, because link adjustments
-- are stable.
-- No need to actually update the branch because the
-- adjustment is stable.
return True
updateAdjustedBranch' :: Adjustment -> AdjBranch -> OrigBranch -> Annex Bool
updateAdjustedBranch' adj (AdjBranch currbranch) origbranch = do
b <- preventCommits $ \commitlck -> do
-- Avoid losing any commits that the adjusted branch has that
-- have not yet been propigated back to the origbranch.
_ <- propigateAdjustedCommits' origbranch adj commitlck
-- Git normally won't do anything when asked to check out the
-- currently checked out branch, even when its ref has
-- changed. Work around this by writing a raw sha to .git/HEAD.
inRepo (Git.Ref.sha currbranch) >>= \case
Just headsha -> inRepo $ \r ->
writeFile (Git.Ref.headFile r) (fromRef headsha)
_ -> noop
adjustBranch adj origbranch
-- Make git checkout quiet to avoid warnings about disconnected
-- branch tips being lost.
checkoutAdjustedBranch b [Param "--quiet"]
adjustToCrippledFileSystem :: Annex ()
adjustToCrippledFileSystem = do
warning "Entering an adjusted branch where files are unlocked as this filesystem does not support locked files."

View file

@ -406,13 +406,13 @@ updateBranches (Nothing, _) = noop
updateBranches (Just branch, madj) = do
-- When in an adjusted branch, propigate any changes made to it
-- back to the original branch. The adjusted branch may also need
-- to be updated to hide/expose files.
-- to be updated, if the adjustment is not stable.
case madj of
Nothing -> noop
Just adj -> do
let origbranch = branch
propigateAdjustedCommits origbranch adj
when (adjustmentHidesFiles adj) $ do
unless (adjustmentIsStable adj) $ do
showSideAction "updating adjusted branch"
let adjbranch = originalToAdjusted origbranch adj
unlessM (updateAdjustedBranch adj adjbranch origbranch) $

View file

@ -62,4 +62,3 @@ instance ReversableAdjustment LinkPresentAdjustment where
adjustmentHidesFiles :: Adjustment -> Bool
adjustmentHidesFiles (PresenceAdjustment HideMissingAdjustment _) = True
adjustmentHidesFiles _ = False