type Version = String
-supportedVersion :: Version
-supportedVersion = "5"
+currentVersion :: Version
+currentVersion = "6"
+
+supportedVersions :: [Version]
+supportedVersions = ["5", currentVersion]
upgradableVersions :: [Version]
#ifndef mingw32_HOST_OS
-upgradableVersions = ["0", "1", "2", "4"]
+upgradableVersions = ["0", "1", "2", "4", "5"]
#else
-upgradableVersions = ["2", "3", "4"]
+upgradableVersions = ["2", "3", "4", "5"]
#endif
autoUpgradeableVersions :: [Version]
liftIO $ do
showPackageVersion
vinfo "local repository version" $ fromMaybe "unknown" v
- vinfo "supported repository version" supportedVersion
+ vinfo "supported repository versions" $
+ unwords supportedVersions
vinfo "upgrade supported from repository versions" $
unwords upgradableVersions
import qualified Upgrade.V2
import qualified Upgrade.V3
import qualified Upgrade.V4
+import qualified Upgrade.V5
checkUpgrade :: Version -> Annex ()
checkUpgrade = maybe noop error <=< needsUpgrade
needsUpgrade :: Version -> Annex (Maybe String)
needsUpgrade v
- | v == supportedVersion = ok
+ | v `elem` supportedVersions = ok
| v `elem` autoUpgradeableVersions = ifM (upgrade True)
( ok
, err "Automatic upgrade failed!"
upgrade automatic = do
upgraded <- go =<< getVersion
when upgraded $
- setVersion supportedVersion
+ setVersion currentVersion
return upgraded
where
#ifndef mingw32_HOST_OS
go (Just "2") = Upgrade.V2.upgrade
go (Just "3") = Upgrade.V3.upgrade automatic
go (Just "4") = Upgrade.V4.upgrade automatic
+ go (Just "5") = Upgrade.V5.upgrade automatic
go _ = return True
ifM (fromRepo Git.repoIsLocalBare)
( do
moveContent
- setVersion supportedVersion
+ setVersion currentVersion
, do
moveContent
updateSymlinks
moveLocationLogs
Annex.Queue.flush
- setVersion supportedVersion
+ setVersion currentVersion
)
Upgrade.V2.upgrade
--- /dev/null
+{- 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
-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.
* Display progress meter in -J mode when copying from a local git repo,
to a local git repo, and from a remote git repo.
not need to configure it manually:
[filter "annex"]
- clean = git-annex smudge --clean %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
like the following in the .gitattributes file:
Upgrade should be handled automatically.
-On upgrade, update .gitattributes with a stock configuration, unless
-it already mentions "filter=annex".
+On upgrade, update $GIT_DIR/info/attributes with a stock configuration,
+unless it already mentions "filter=annex".
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).
So will need to stage changes to all annexed files.
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.
----
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)
The upgrade from v4 to v5 is handled