diff --git a/Annex/AdjustedBranch.hs b/Annex/AdjustedBranch.hs index 177ed77bf8..f2a624987b 100644 --- a/Annex/AdjustedBranch.hs +++ b/Annex/AdjustedBranch.hs @@ -28,6 +28,7 @@ module Annex.AdjustedBranch ( checkAdjustedClone, isSupported, checkVersionSupported, + isGitVersionSupported, ) where import Annex.Common @@ -227,6 +228,7 @@ updateAdjustedBranch adj@(LinkAdjustment _) _ origbranch = preventCommits $ \com adjustToCrippledFileSystem :: Annex () adjustToCrippledFileSystem = do warning "Entering an adjusted branch where files are unlocked as this filesystem does not support locked files." + checkVersionSupported whenM (isNothing <$> originalBranch) $ void $ inRepo $ Git.Branch.commitCommand Git.Branch.AutomaticCommit [ Param "--quiet" diff --git a/Annex/Init.hs b/Annex/Init.hs index cb7a81003d..6736e84ae2 100644 --- a/Annex/Init.hs +++ b/Annex/Init.hs @@ -23,6 +23,7 @@ import qualified Annex import qualified Git import qualified Git.Config import qualified Git.Objects +import qualified Git.LsFiles import qualified Annex.Branch import Logs.UUID import Logs.Trust.Basic @@ -32,11 +33,12 @@ import Types.RepoVersion import Annex.Version import Annex.Difference import Annex.UUID +import Annex.Link import Annex.WorkTree import Config import Config.Smudge import Annex.Direct -import Annex.AdjustedBranch +import qualified Annex.AdjustedBranch as AdjustedBranch import Annex.Environment import Annex.Hook import Annex.InodeSentinal @@ -114,13 +116,13 @@ initialize' ai mversion = checkCanInitialize ai $ do unlessM isBareRepo $ do hookWrite postCheckoutHook hookWrite postMergeHook - checkAdjustedClone >>= \case - NeedUpgradeForAdjustedClone -> + AdjustedBranch.checkAdjustedClone >>= \case + AdjustedBranch.NeedUpgradeForAdjustedClone -> void $ upgrade True versionForAdjustedClone - InAdjustedClone -> return () - NotInAdjustedClone -> + AdjustedBranch.InAdjustedClone -> return () + AdjustedBranch.NotInAdjustedClone -> ifM (crippledFileSystem <&&> (not <$> isBareRepo)) - ( adjustToCrippledFileSystem + ( adjustToCrippledFilesystem -- Handle case where this repo was cloned from a -- direct mode repo , unlessM isBareRepo @@ -282,3 +284,20 @@ propigateSecureHashesOnly :: Annex () propigateSecureHashesOnly = maybe noop (setConfig (ConfigKey "annex.securehashesonly")) =<< getGlobalConfig "annex.securehashesonly" + +adjustToCrippledFilesystem :: Annex () +adjustToCrippledFilesystem = ifM (liftIO $ AdjustedBranch.isGitVersionSupported) + ( do + void $ upgrade True versionForCrippledFilesystem + AdjustedBranch.adjustToCrippledFileSystem + , enableDirectMode + ) + +enableDirectMode :: Annex () +enableDirectMode = unlessM isDirect $ do + warning "Enabling direct mode." + top <- fromRepo Git.repoPath + (l, clean) <- inRepo $ Git.LsFiles.inRepo [top] + forM_ l $ \f -> + maybe noop (`toDirect` f) =<< isAnnexLink f + void $ liftIO clean diff --git a/Annex/Version.hs b/Annex/Version.hs index d7cd816f8d..5827dcbd4a 100644 --- a/Annex/Version.hs +++ b/Annex/Version.hs @@ -28,6 +28,9 @@ supportedVersions = map RepoVersion [5, 7] versionForAdjustedClone :: RepoVersion versionForAdjustedClone = RepoVersion 7 +versionForCrippledFilesystem :: RepoVersion +versionForCrippledFilesystem = RepoVersion 7 + upgradableVersions :: [RepoVersion] #ifndef mingw32_HOST_OS upgradableVersions = map RepoVersion [0..6] diff --git a/CHANGELOG b/CHANGELOG index fbb0fbb394..0b40a64107 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -5,6 +5,10 @@ git-annex (7.20181122) UNRELEASED; urgency=medium Thanks, Robert Schütz * When running youtube-dl to get a filename, pass --no-playlist. * Fix build without concurrent-output. + * init: When a crippled filesystem causes an adjusted unlocked branch to + be used, set repo version to 7, which it neglected to do before. + * init: When on a crippled filesystem, and the git version is too old + to use an adjusted unlocked branch, fall back to using direct mode. -- Joey Hess Tue, 27 Nov 2018 12:29:27 -0400