Avoid leaving repo with a detached head when there is a failure checking out an updated adjusted branch
I don't know of scenarios where that can happen (besides the bug fixed by the parent commit), but there probably are some. Sponsored-by: Boyd Stephen Smith Jr. on Patreon
This commit is contained in:
parent
cb4d9f7b1f
commit
038a2600f4
3 changed files with 26 additions and 8 deletions
|
@ -248,26 +248,42 @@ checkoutAdjustedBranch (AdjBranch b) quietcheckout = do
|
|||
updateAdjustedBranch :: Adjustment -> AdjBranch -> OrigBranch -> Annex Bool
|
||||
updateAdjustedBranch adj (AdjBranch currbranch) origbranch
|
||||
| not (adjustmentIsStable adj) = do
|
||||
b <- preventCommits $ \commitlck -> do
|
||||
(b, origheadfile, newheadfile) <- 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
|
||||
|
||||
origheadfile <- inRepo $ readFile . Git.Ref.headFile
|
||||
|
||||
-- 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
|
||||
newheadfile <- inRepo (Git.Ref.sha currbranch) >>= \case
|
||||
Just headsha -> do
|
||||
inRepo $ \r -> do
|
||||
let newheadfile = fromRef headsha
|
||||
writeFile (Git.Ref.headFile r) newheadfile
|
||||
return (Just newheadfile)
|
||||
_ -> return Nothing
|
||||
|
||||
adjustBranch adj origbranch
|
||||
b <- adjustBranch adj origbranch
|
||||
return (b, origheadfile, newheadfile)
|
||||
|
||||
-- Make git checkout quiet to avoid warnings about
|
||||
-- disconnected branch tips being lost.
|
||||
checkoutAdjustedBranch b True
|
||||
ok <- checkoutAdjustedBranch b True
|
||||
|
||||
-- Avoid leaving repo with detached head.
|
||||
unless ok $ case newheadfile of
|
||||
Nothing -> noop
|
||||
Just v -> preventCommits $ \_commitlck -> inRepo $ \r -> do
|
||||
v' <- readFile (Git.Ref.headFile r)
|
||||
when (v == v') $
|
||||
writeFile (Git.Ref.headFile r) origheadfile
|
||||
|
||||
return ok
|
||||
| otherwise = preventCommits $ \commitlck -> do
|
||||
-- Done for consistency.
|
||||
_ <- propigateAdjustedCommits' origbranch adj commitlck
|
||||
|
|
|
@ -3,6 +3,8 @@ git-annex (10.20230322) UNRELEASED; urgency=medium
|
|||
* sync: Fix parsing of gcrypt::rsync:// urls that use a relative path.
|
||||
* Avoid failure to update adjusted branch --unlock-present after git-annex
|
||||
drop when annex.adjustedbranchrefresh=1
|
||||
* Avoid leaving repo with a detached head when there is a failure
|
||||
checking out an updated adjusted branch.
|
||||
|
||||
-- Joey Hess <id@joeyh.name> Thu, 23 Mar 2023 15:04:41 -0400
|
||||
|
||||
|
|
|
@ -53,4 +53,4 @@ local repository version: 8
|
|||
|
||||
git-annex is too good. It so rarely causes problems that one does not develop the "git-annex troubleshooting muscle". :)
|
||||
|
||||
|
||||
> [[fixed|done]] --[[Joey]]
|
||||
|
|
Loading…
Reference in a new issue