]> dgit.raspbian.org Git - git-annex.git/commitdiff
detect v10 upgrade while running
authorJoey Hess <joeyh@joeyh.name>
Fri, 21 Jan 2022 16:56:07 +0000 (12:56 -0400)
committerJoey Hess <joeyh@joeyh.name>
Fri, 21 Jan 2022 16:56:38 +0000 (12:56 -0400)
Capstone of the v10 upgrade process.

Tested with a git-annex drop in a v8 repo that had a local v8 remote.
Upgrading the repo to v10 (with --force) immedaitely caused it to notice
and switch over to v10 locking. Upgrading the remote also caused it to
switch over when operating on the remote.

The InodeCache makes this fairly efficient, just an added stat call per
lock of an object file. After the v10 upgrade, there is no more
overhead.

Sponsored-by: Dartmouth College's Datalad project
Annex.hs
Annex/Content/Presence.hs

index cc2f8b160787724e387968ff526a23d839033511..394825244314732f9bf41cf03d5b7b4c2e7e9598 100644 (file)
--- a/Annex.hs
+++ b/Annex.hs
@@ -154,6 +154,7 @@ data AnnexState = AnnexState
        , gitconfigadjustment :: (GitConfig -> GitConfig)
        , gitconfigoverride :: [String]
        , gitremotes :: Maybe [Git.Repo]
+       , gitconfiginodecache :: Maybe InodeCache
        , backend :: Maybe (BackendA Annex)
        , remotes :: [Types.Remote.RemoteA Annex]
        , output :: MessageState
@@ -214,6 +215,7 @@ newAnnexState c r = do
                , gitconfigadjustment = id
                , gitconfigoverride = []
                , gitremotes = Nothing
+               , gitconfiginodecache = Nothing
                , backend = Nothing
                , remotes = []
                , output = o
index 67c430efbc0f6bc700c3a591ebbe2a59f818cf18..48c8b9287307fa96431d6bfabf2389345b93e417 100644 (file)
@@ -6,6 +6,7 @@
  -}
 
 {-# LANGUAGE CPP #-}
+{-# LANGUAGE OverloadedStrings #-}
 
 module Annex.Content.Presence (
        inAnnex,
@@ -31,11 +32,15 @@ import qualified Database.Keys
 import Annex.InodeSentinal
 import Utility.InodeCache
 import qualified Utility.RawFilePath as R
+import qualified Git
+import Config
 
 #ifdef mingw32_HOST_OS
 import Annex.Perms
 #endif
 
+import qualified System.FilePath.ByteString as P
+
 {- Checks if a given key's content is currently present. -}
 inAnnex :: Key -> Annex Bool
 inAnnex key = inAnnexCheck key $ liftIO . R.doesPathExist
@@ -130,10 +135,29 @@ inAnnexSafe key = inAnnex' (fromMaybe True) (Just False) go key
 withContentLockFile :: Key -> (Maybe RawFilePath -> Annex a) -> Annex a
 withContentLockFile k a = do
        v <- getVersion
-       let go = contentLockFile k v >>= a
        if versionNeedsWritableContentFiles v
-               then withSharedLock gitAnnexContentLockLock go
-               else go
+               then withSharedLock gitAnnexContentLockLock $ do
+                       {- While the lock is held, check to see if the git
+                        - config has changed, and reload it if so. This
+                        - updates the annex.version after the v10 upgrade,
+                        - so that a process that started in a v9 repository
+                        - will switch over to v10 content lock files at the
+                        - right time. -}
+                       gitdir <- fromRepo Git.localGitDir
+                       let gitconfig = gitdir P.</> "config"
+                       ic <- withTSDelta (liftIO . genInodeCache gitconfig)
+                       oldic <- Annex.getState Annex.gitconfiginodecache
+                       v' <- if fromMaybe False (compareStrong <$> ic <*> oldic)
+                               then pure v
+                               else do
+                                       Annex.changeState $ \s -> 
+                                               s { Annex.gitconfiginodecache = ic }
+                                       reloadConfig
+                                       getVersion
+                       go (v')
+               else (go v)
+  where
+       go v = contentLockFile k v >>= a
 
 contentLockFile :: Key -> Maybe RepoVersion -> Annex (Maybe RawFilePath)
 #ifndef mingw32_HOST_OS