handle upgrading repositories initialized with --version=9

As was attempted earlier in the buggy commit 0d2e3058ee

Avoided the bug that had by making the upgrade log be updated after each
upgrade step. So, after upgrade from v8 to v9, the log is updated, and
so Upgrade.V9's timeOfUpgrade check will find that it was upgraded
recently and so won't let it skip ahead to v10.

Sponsored-by: k0ld on Patreon
This commit is contained in:
Joey Hess 2022-09-26 12:55:51 -04:00
parent 8230f4a6f1
commit e05dd70544
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
4 changed files with 19 additions and 21 deletions

View file

@ -74,31 +74,24 @@ needsUpgrade v
Left ex -> err $ "Automatic upgrade exception! " ++ show ex
upgrade :: Bool -> RepoVersion -> Annex Bool
upgrade automatic destversion = do
startversion <- getVersion
(ok, newversion) <- go startversion
when (ok && newversion /= startversion) $
postupgrade newversion
return ok
upgrade automatic destversion = go =<< getVersion
where
go (Just v)
| v >= destversion = return (True, Just v)
| v >= destversion = return True
| otherwise = ifM upgradingRemote
( upgraderemote
, up v >>= \case
UpgradeSuccess -> go (Just (incrversion v) )
UpgradeFailed -> return (False, Just v)
UpgradeDeferred -> return (True, Just v)
UpgradeSuccess -> do
let v' = incrversion v
upgradedto v'
go (Just v')
UpgradeFailed -> return False
UpgradeDeferred -> return True
)
go Nothing = return (True, Nothing)
go Nothing = return True
incrversion v = RepoVersion (fromRepoVersion v + 1)
postupgrade newversion = ifM upgradingRemote
( reloadConfig
, maybe noop upgradedto newversion
)
#ifndef mingw32_HOST_OS
up (RepoVersion 0) = Upgrade.V0.upgrade
up (RepoVersion 1) = Upgrade.V1.upgrade
@ -121,15 +114,18 @@ upgrade automatic destversion = do
-- upgrading a git repo other than the current repo.
upgraderemote = do
rp <- fromRawFilePath <$> fromRepo Git.repoPath
gitAnnexChildProcess "upgrade"
ok <- gitAnnexChildProcess "upgrade"
[ Param "--quiet"
, Param "--autoonly"
]
(\p -> p { cwd = Just rp })
(\_ _ _ pid -> waitForProcess pid >>= return . \case
ExitSuccess -> (True, Nothing)
_ -> (False, Nothing)
ExitSuccess -> True
_ -> False
)
when ok
reloadConfig
return ok
upgradedto v = do
setVersion v