From 88cef18fac54b54a5fb578166baaa303d185b014 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 24 Nov 2020 12:31:17 -0400 Subject: [PATCH] upgrade: Support an edge case upgrading a v5 direct mode repo where nothing had ever been committed to the head branch This commit was sponsored by Jack Hill on Patreon. --- Annex/AdjustedBranch.hs | 27 +++++++++++++------ CHANGELOG | 2 ++ Upgrade/V5.hs | 9 +++++-- ...de_fail_with_annex.alwayscommit=false.mdwn | 3 +-- 4 files changed, 29 insertions(+), 12 deletions(-) diff --git a/Annex/AdjustedBranch.hs b/Annex/AdjustedBranch.hs index 10715bc227..794493846c 100644 --- a/Annex/AdjustedBranch.hs +++ b/Annex/AdjustedBranch.hs @@ -26,6 +26,7 @@ module Annex.AdjustedBranch ( adjustBranch, adjustTree, adjustToCrippledFileSystem, + commitForAdjustedBranch, propigateAdjustedCommits, propigateAdjustedCommits', commitAdjustedTree, @@ -334,14 +335,8 @@ adjustToCrippledFileSystem :: Annex () adjustToCrippledFileSystem = do warning "Entering an adjusted branch where files are unlocked as this filesystem does not support locked files." checkVersionSupported - whenM (isNothing <$> inRepo Git.Branch.current) $ do - cmode <- annexCommitMode <$> Annex.getGitConfig - void $ inRepo $ Git.Branch.commitCommand cmode - [ Param "--quiet" - , Param "--allow-empty" - , Param "-m" - , Param "commit before entering adjusted unlocked branch" - ] + whenM (isNothing <$> inRepo Git.Branch.current) $ + commitForAdjustedBranch [] inRepo Git.Branch.current >>= \case Just currbranch -> case getAdjustment currbranch of Just curradj | curradj == adj -> return () @@ -358,6 +353,22 @@ adjustToCrippledFileSystem = do adj = LinkAdjustment UnlockAdjustment failedenter = warning "Failed to enter adjusted branch!" +{- Commit before entering adjusted branch. Only needs to be done + - when the current branch does not have any commits yet. + - + - If something is already staged, it will be committed, but otherwise + - an empty commit will be made. + -} +commitForAdjustedBranch :: [CommandParam] -> Annex () +commitForAdjustedBranch ps = do + cmode <- annexCommitMode <$> Annex.getGitConfig + void $ inRepo $ Git.Branch.commitCommand cmode $ + [ Param "--quiet" + , Param "--allow-empty" + , Param "-m" + , Param "commit before entering adjusted branch" + ] ++ ps + setBasisBranch :: BasisBranch -> Ref -> Annex () setBasisBranch (BasisBranch basis) new = inRepo $ Git.Branch.update' basis new diff --git a/CHANGELOG b/CHANGELOG index 620ee2ccb8..b654e35857 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -20,6 +20,8 @@ git-annex (8.20201117) UNRELEASED; urgency=medium locally. * Fix building without the torrent library. Thanks, Kyle Meyer. + * upgrade: Support an edge case upgrading a v5 direct mode repo + where nothing had ever been committed to the head branch. -- Joey Hess Mon, 16 Nov 2020 09:38:32 -0400 diff --git a/Upgrade/V5.hs b/Upgrade/V5.hs index ead7636f27..98e60601f1 100644 --- a/Upgrade/V5.hs +++ b/Upgrade/V5.hs @@ -88,8 +88,13 @@ convertDirect = do - as does annex.thin. -} setConfig (annexConfig "thin") (boolConfig True) Direct.setIndirect - cur <- fromMaybe (error "Somehow no branch is checked out") - <$> inRepo Git.Branch.current + cur <- inRepo Git.Branch.current >>= \case + Just cur -> return cur + Nothing -> do + -- Avoid running pre-commit hook. + commitForAdjustedBranch [Param "--no-verify"] + fromMaybe (giveup "Nothing is committed, and a commit failed; unable to proceed.") + <$> inRepo Git.Branch.current upgradeDirectWorkTree removeDirectCruft {- Create adjusted branch where all files are unlocked. diff --git a/doc/bugs/v5_direct_upgrade_fail_with_annex.alwayscommit=false.mdwn b/doc/bugs/v5_direct_upgrade_fail_with_annex.alwayscommit=false.mdwn index 8989c3e931..65810f5918 100644 --- a/doc/bugs/v5_direct_upgrade_fail_with_annex.alwayscommit=false.mdwn +++ b/doc/bugs/v5_direct_upgrade_fail_with_annex.alwayscommit=false.mdwn @@ -36,5 +36,4 @@ and this sequence of commands: Note that lack of git-annex sync, which is why the branch never got created. The index file has the adds staged of course. -So, fixing this unusual case needs the upgrade code to go ahead and commit -the staged index first. +> [[fixed|done]] --[[Joey]]