add v6; keep v5 working for now and manual upgrade
Since all places where a repo is used in direct mode need to have git-annex upgraded before the repo can safely be converted to v6, the upgrade needs to be manual for now. I suppose that at some point I'll want to drop all the direct mode support code. At that point, will stop supporting v5, and will need to auto-upgrade any remaining v5 repos. If possible, I'd like to carry the direct mode support for say, a year or so, to give people plenty of time to upgrade and avoid disruption.
This commit is contained in:
parent
34ead644d9
commit
ccc49861ca
9 changed files with 74 additions and 14 deletions
|
@ -15,14 +15,17 @@ import qualified Annex
|
||||||
|
|
||||||
type Version = String
|
type Version = String
|
||||||
|
|
||||||
supportedVersion :: Version
|
currentVersion :: Version
|
||||||
supportedVersion = "5"
|
currentVersion = "6"
|
||||||
|
|
||||||
|
supportedVersions :: [Version]
|
||||||
|
supportedVersions = ["5", currentVersion]
|
||||||
|
|
||||||
upgradableVersions :: [Version]
|
upgradableVersions :: [Version]
|
||||||
#ifndef mingw32_HOST_OS
|
#ifndef mingw32_HOST_OS
|
||||||
upgradableVersions = ["0", "1", "2", "4"]
|
upgradableVersions = ["0", "1", "2", "4", "5"]
|
||||||
#else
|
#else
|
||||||
upgradableVersions = ["2", "3", "4"]
|
upgradableVersions = ["2", "3", "4", "5"]
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
autoUpgradeableVersions :: [Version]
|
autoUpgradeableVersions :: [Version]
|
||||||
|
|
|
@ -50,7 +50,8 @@ showVersion = do
|
||||||
liftIO $ do
|
liftIO $ do
|
||||||
showPackageVersion
|
showPackageVersion
|
||||||
vinfo "local repository version" $ fromMaybe "unknown" v
|
vinfo "local repository version" $ fromMaybe "unknown" v
|
||||||
vinfo "supported repository version" supportedVersion
|
vinfo "supported repository versions" $
|
||||||
|
unwords supportedVersions
|
||||||
vinfo "upgrade supported from repository versions" $
|
vinfo "upgrade supported from repository versions" $
|
||||||
unwords upgradableVersions
|
unwords upgradableVersions
|
||||||
|
|
||||||
|
|
|
@ -18,13 +18,14 @@ import qualified Upgrade.V1
|
||||||
import qualified Upgrade.V2
|
import qualified Upgrade.V2
|
||||||
import qualified Upgrade.V3
|
import qualified Upgrade.V3
|
||||||
import qualified Upgrade.V4
|
import qualified Upgrade.V4
|
||||||
|
import qualified Upgrade.V5
|
||||||
|
|
||||||
checkUpgrade :: Version -> Annex ()
|
checkUpgrade :: Version -> Annex ()
|
||||||
checkUpgrade = maybe noop error <=< needsUpgrade
|
checkUpgrade = maybe noop error <=< needsUpgrade
|
||||||
|
|
||||||
needsUpgrade :: Version -> Annex (Maybe String)
|
needsUpgrade :: Version -> Annex (Maybe String)
|
||||||
needsUpgrade v
|
needsUpgrade v
|
||||||
| v == supportedVersion = ok
|
| v `elem` supportedVersions = ok
|
||||||
| v `elem` autoUpgradeableVersions = ifM (upgrade True)
|
| v `elem` autoUpgradeableVersions = ifM (upgrade True)
|
||||||
( ok
|
( ok
|
||||||
, err "Automatic upgrade failed!"
|
, err "Automatic upgrade failed!"
|
||||||
|
@ -40,7 +41,7 @@ upgrade :: Bool -> Annex Bool
|
||||||
upgrade automatic = do
|
upgrade automatic = do
|
||||||
upgraded <- go =<< getVersion
|
upgraded <- go =<< getVersion
|
||||||
when upgraded $
|
when upgraded $
|
||||||
setVersion supportedVersion
|
setVersion currentVersion
|
||||||
return upgraded
|
return upgraded
|
||||||
where
|
where
|
||||||
#ifndef mingw32_HOST_OS
|
#ifndef mingw32_HOST_OS
|
||||||
|
@ -53,4 +54,5 @@ upgrade automatic = do
|
||||||
go (Just "2") = Upgrade.V2.upgrade
|
go (Just "2") = Upgrade.V2.upgrade
|
||||||
go (Just "3") = Upgrade.V3.upgrade automatic
|
go (Just "3") = Upgrade.V3.upgrade automatic
|
||||||
go (Just "4") = Upgrade.V4.upgrade automatic
|
go (Just "4") = Upgrade.V4.upgrade automatic
|
||||||
|
go (Just "5") = Upgrade.V5.upgrade automatic
|
||||||
go _ = return True
|
go _ = return True
|
||||||
|
|
|
@ -54,14 +54,14 @@ upgrade = do
|
||||||
ifM (fromRepo Git.repoIsLocalBare)
|
ifM (fromRepo Git.repoIsLocalBare)
|
||||||
( do
|
( do
|
||||||
moveContent
|
moveContent
|
||||||
setVersion supportedVersion
|
setVersion currentVersion
|
||||||
, do
|
, do
|
||||||
moveContent
|
moveContent
|
||||||
updateSymlinks
|
updateSymlinks
|
||||||
moveLocationLogs
|
moveLocationLogs
|
||||||
|
|
||||||
Annex.Queue.flush
|
Annex.Queue.flush
|
||||||
setVersion supportedVersion
|
setVersion currentVersion
|
||||||
)
|
)
|
||||||
|
|
||||||
Upgrade.V2.upgrade
|
Upgrade.V2.upgrade
|
||||||
|
|
18
Upgrade/V5.hs
Normal file
18
Upgrade/V5.hs
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
{- git-annex v5 -> v6 uppgrade support
|
||||||
|
-
|
||||||
|
- Copyright 2015 Joey Hess <id@joeyh.name>
|
||||||
|
-
|
||||||
|
- Licensed under the GNU GPL version 3 or higher.
|
||||||
|
-}
|
||||||
|
|
||||||
|
module Upgrade.V5 where
|
||||||
|
|
||||||
|
import Common.Annex
|
||||||
|
import Config
|
||||||
|
|
||||||
|
upgrade :: Bool -> Annex Bool
|
||||||
|
upgrade automatic = do
|
||||||
|
unless automatic $
|
||||||
|
showAction "v5 to v6"
|
||||||
|
configureSmudgeFilter
|
||||||
|
return True
|
8
debian/changelog
vendored
8
debian/changelog
vendored
|
@ -1,5 +1,11 @@
|
||||||
git-annex (5.20151117) UNRELEASED; urgency=medium
|
git-annex (6.20151117) UNRELEASED; urgency=medium
|
||||||
|
|
||||||
|
* annex.version increased to 6, but version 5 is also still supported.
|
||||||
|
* The upgrade to version 6 is not done fully automatically, because
|
||||||
|
upgrading a direct mode repository to version 6 will prevent old
|
||||||
|
versions of git-annex from working in that repository.
|
||||||
|
* smudge: New command, used for git smudge filter.
|
||||||
|
This will replace direct mode.
|
||||||
* Build with -j1 again to get reproducible build.
|
* Build with -j1 again to get reproducible build.
|
||||||
* Display progress meter in -J mode when copying from a local git repo,
|
* Display progress meter in -J mode when copying from a local git repo,
|
||||||
to a local git repo, and from a remote git repo.
|
to a local git repo, and from a remote git repo.
|
||||||
|
|
|
@ -17,8 +17,8 @@ but this is normally set up for you by git-annex init, so you should
|
||||||
not need to configure it manually:
|
not need to configure it manually:
|
||||||
|
|
||||||
[filter "annex"]
|
[filter "annex"]
|
||||||
clean = git-annex smudge --clean %f
|
|
||||||
smudge = git-annex smudge %f
|
smudge = git-annex smudge %f
|
||||||
|
clean = git-annex smudge --clean %f
|
||||||
|
|
||||||
To make git use this filter on all files except for dotfiles, put something
|
To make git use this filter on all files except for dotfiles, put something
|
||||||
like the following in the .gitattributes file:
|
like the following in the .gitattributes file:
|
||||||
|
|
|
@ -308,15 +308,17 @@ annex.version changes to 6
|
||||||
|
|
||||||
Upgrade should be handled automatically.
|
Upgrade should be handled automatically.
|
||||||
|
|
||||||
On upgrade, update .gitattributes with a stock configuration, unless
|
On upgrade, update $GIT_DIR/info/attributes with a stock configuration,
|
||||||
it already mentions "filter=annex".
|
unless it already mentions "filter=annex".
|
||||||
|
|
||||||
Upgrading a direct mode repo needs to switch it out of bare mode, and
|
Upgrading a direct mode repo needs to switch it out of bare mode, and
|
||||||
needs to run `git annex unlock` on all files (or reach the same result).
|
needs to run `git annex unlock` on all files (or reach the same result).
|
||||||
So will need to stage changes to all annexed files.
|
So will need to stage changes to all annexed files.
|
||||||
|
|
||||||
When a repo has some clones indirect and some direct, the upgraded repo
|
When a repo has some clones indirect and some direct, the upgraded repo
|
||||||
will have all files unlocked, necessarily in all clones.
|
will have all files unlocked, necessarily in all clones. This happens
|
||||||
|
automatically, because when the direct repos are upgraded that causes the
|
||||||
|
files to be unlocked, while the indirect upgrades don't touch the files.
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,34 @@ conflicts first before upgrading git-annex.
|
||||||
|
|
||||||
The upgrade events, so far:
|
The upgrade events, so far:
|
||||||
|
|
||||||
|
## v5 -> v6 (git-annex version 6.x)
|
||||||
|
|
||||||
|
The upgrade from v5 to v6 is handled manually. Run `git-annex upgrade`
|
||||||
|
perform the upgrade.
|
||||||
|
|
||||||
|
All places that a direct mode repository is cloned to should be
|
||||||
|
running git-annex version 6.x before you upgrade the repository.
|
||||||
|
This is necessary because the contents of the repository are changed
|
||||||
|
in the upgrade, and the old version of git-annex won't be able to
|
||||||
|
access files after the repo is upgraded.
|
||||||
|
|
||||||
|
If a repository is only used in indirect mode, this upgrade will not
|
||||||
|
affect it significantly. You can use git-annex v5 and v6 in different
|
||||||
|
clones of the same indirect mode repository without problems.
|
||||||
|
|
||||||
|
This upgrade does away with the direct mode/indirect mode distinction.
|
||||||
|
A v6 git-annex repository can have some files locked and other files
|
||||||
|
unlocked, and all git and git-annex commands can be used on both locked and
|
||||||
|
unlocked files. (Although for locked files to work, the filesystem
|
||||||
|
must support symbolic links..)
|
||||||
|
|
||||||
|
On upgrade, all files in a direct mode repository will be converted to
|
||||||
|
unlocked files. The upgrade will need to stage changes to all files in
|
||||||
|
the git repository.
|
||||||
|
|
||||||
|
If a repository has some clones using direct mode and some using indirect
|
||||||
|
mode, all the files will end up unlocked in all clones after the upgrade.
|
||||||
|
|
||||||
## v4 -> v5 (git-annex version 5.x)
|
## v4 -> v5 (git-annex version 5.x)
|
||||||
|
|
||||||
The upgrade from v4 to v5 is handled
|
The upgrade from v4 to v5 is handled
|
||||||
|
|
Loading…
Add table
Reference in a new issue